【问题标题】:Strange behavior in HttpSession in a web applicationWeb 应用程序中 HttpSession 的奇怪行为
【发布时间】:2013-06-28 10:08:10
【问题描述】:
我有一个使用 HTTP 会话来跟踪用户状态的 Web 应用程序。我正在尝试调试一个错误,我必须将会话超时设置为 2 分钟。我将 web.xml -> session-timeout 修改为 2。通过将日志语句添加到自定义 HTTP 会话侦听器,我可以看到会话在 2 分钟后创建和销毁我没有登录应用程序。登录后,会话在创建后大约 20 分钟被销毁。我还尝试关闭浏览器以避免任何延长会话寿命的 AJAX 调用,但我仍然看到相同的行为。看起来应用程序中的其他东西正在延长会话寿命,这可能是什么原因?从哪里开始寻找解决此问题的方法?
【问题讨论】:
标签:
java
session
web-applications
servlets
【解决方案1】:
验证您的登录 servlet、目标 jsp 或任何会话侦听器没有以编程方式覆盖 web.xml 中设置的会话超时值。在您的代码库中搜索 setMaxInactiveInterval。
session.setMaxInactiveInterval(20*60); // seconds
【解决方案2】:
首先检查您已以编程方式设置会话时间的代码,它会在您登录时替换 xml 值。
打印 getMaxInactiveInterval() 结束代码。如果不是你在 web.xml 中设置的,那就意味着它在其他地方被改变了。
检查代码中的 setMaxInactiveInterval(int interval)。
HttpSession 一直存在直到它没有被使用超过时间,您可以在 web.xml 中指定一个设置,默认为 30 分钟。因此,当客户端超过 30 分钟不再访问 webapp 时,servletcontainer 将丢弃会话。每个后续请求,即使指定了 cookie,也将无法再访问同一会话。 servlet 容器将创建一个新容器。
查看会话api 了解更多详情
【解决方案3】:
如果 20 分钟不是一个准确的估计值:
您是否使用 request.getSession(); 或 request.getSession(true); 在任何地方检索会话?
如果是,那么这可能是一个原因。
为了避免这种情况, request.getSession(false); 可以帮助您停止会话生命周期的延长。
您的“大约 20 分钟”的近似值可能与会话打开到 db 或其他一些处理的业务逻辑请求的生命周期有关。
正如其他答案中所建议的,"setMaxInterval();" 可能是奇怪的“20 分钟”现象的原因。