【发布时间】:2014-01-30 14:09:46
【问题描述】:
我是 JEE 的新手,这让我很困惑。根据HttpSession.html#setMaxInactiveInterval(int interval)文档
interval值等于或小于zero表示会话不应超时。
但是根据我的教科书(已经有几年的历史了 - 所以我希望它并不总是正确的)使用零作为参数应该会导致会话立即超时。
这段代码
public class Test extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
session.setAttribute("foo", 42);
session.setMaxInactiveInterval(0);
out.println(session.getAttribute("foo"));//problem here
}
}
在 Glassfish 4.0 上使用似乎证实了教科书而不是较新的官方文档中的理论,因为它返回 HTTP 状态 500 - 内部服务器错误 并带有错误消息
java.lang.IllegalStateException: getAttribute: Session already invalidated
这里发生了什么?这是 Glassfish 4.0 错误还是文档有误?或者也许还有第三种选择?
PS。此代码在负值(会话未失效)下正常工作,我在代码中使用-1 而不是0。我只是对0 有什么问题感兴趣。
【问题讨论】:
-
该代码适用于 Tomcat 7。尝试使用
-1。 -
@SotiriosDelimanolis 谢谢。
-1工作正常,因为它看起来更安全,所以我使用它而不是0。我只是好奇零有什么问题。 -
如果在 web.xml 中将
session-configsession-timeout值设置为 0 会发生什么? -
@SotiriosDelimanolis 当我从代码中删除
session.setMaxInactiveInterval(0);并在web.xml中使用<session-config><session-timeout>0</session-timeout></session-config>时,它似乎工作正常(会话没有被破坏)。有趣的是session.getMaxInactiveInterval()返回-60(以秒为单位),所以session-timeout的值似乎转换为-1(以分钟为单位) -
是的,配置以分钟为单位,而
setMaxInactiveInterval以秒为单位。
标签: java session jakarta-ee glassfish session-timeout