会话超时混淆 - session.setMaxInactiveInterval(0)

时间:2014-01-11 15:21:37

标签: java session java-ee glassfish session-timeout

我是JEE的新手,这让我很困惑。根据{{​​3}}文档

  

intervalzero或更低表示会话永远不会超时

但是根据我的教科书(已经有几年了 - 所以我希望它不总是正确的)使用零作为参数会导致会话立即超时。

此代码

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的错误感兴趣。

2 个答案:

答案 0 :(得分:5)

会话超时的Servlet Specification章节说明

  

根据定义,如果会话的超时时间设置为-1,则   会话永远不会过期。

所以GlasshFish似乎已经涵盖了这一点。我在规范中找不到任何引用,对0 setMaxInactiveInterval()的值应该是相同的。但它确实说

  

session-config定义此Web的会话参数   应用。子元素session-timeout定义默认值   在此Web中创建的所有会话的会话超时间隔   应用。指定的超时必须以整体表示   分钟数。 如果超时为0或更少,则容器会确保   会话的默认行为永远不会超时。如果这个元素   如果未指定,则容器必须设置其默认超时时间。

答案 1 :(得分:0)

这已经超时并且无效

session.setMaxInactiveInterval(0); // mean inactive immediately

所以这是正确的错误信息。 (请参阅第一本书以供进一步参考。)

您正在尝试访问不存在的对象值。它已经被销毁了