【发布时间】:2010-08-05 20:19:55
【问题描述】:
我在 JSP 页面中设置了一个带有一些数据的 bean,但是当我尝试访问该值时,在我的 servlet 中,我得到了一个空值。我在两个页面中都打印了会话 ID,并且得到了不同的值。有谁知道可能会发生什么?谢谢。
【问题讨论】:
-
您是否在某些可能被执行的代码路径中的任何地方调用 session.invalidate()?
我在 JSP 页面中设置了一个带有一些数据的 bean,但是当我尝试访问该值时,在我的 servlet 中,我得到了一个空值。我在两个页面中都打印了会话 ID,并且得到了不同的值。有谁知道可能会发生什么?谢谢。
【问题讨论】:
我最好的猜测是您的会话在某处失效。如果您的代码中确实有 session.invalidate() 语句,请将断点放在那里并在调试模式下验证是否有任何被命中。
您还可以在您的项目中实施和设置HttpSessionListener。实现回调接口并将实现类添加到你的web.xml:
<listener>
<listener-class>com.xyz.AppSessionListener</listener-class>
</listener>
在sessionDestroyed 方法中放置一个断点,看看它何时在调试模式下被命中。
【讨论】:
我没有注意到您为此提出了一个新问题。此问题已在您的previous question 的 cmets 中得到解答。以下是相关性摘录:
会话取决于域和上下文。如果 servlet 侦听与 JSP 不同的域和/或上下文的 URL,那么它确实会使用不同的会话。但是,您可以通过相应地配置 servletcontainer 让不同的上下文共享相同的会话(在 Tomcat 中,将
<Connector>的emptySessionPath属性设置为true)。但是由于 HTTP 规范中的安全限制,您不能在不同域之间共享会话。
另一个原因确实是您通过HttpSession#invalidate() 明确地使会话无效,但这太明显而无法在您的代码中发现。
【讨论】: