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

JEE*_*oob 5 java session glassfish session-timeout java-ee

我是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

    }
}
Run Code Online (Sandbox Code Playgroud)

在Glassfish 4.0上使用似乎从教科书而不是更新的官方文档确认理论,因为它返回HTTP状态500 - 内部服务器错误,错误消息

java.lang.IllegalStateException: getAttribute: Session already invalidated

这里发生了什么?这个Glassfish 4.0错误或文档是错误的吗?或者也许有第三种选择?


PS.这段代码的工作原理应该是负值(会话没有失效),我正在使用-1而不是0在我的代码中.我只是对有问题感兴趣0.

Sot*_*lis 6

会话超时的Servlet规范章节说明

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

所以GlasshFish似乎已经涵盖了这一点.我在规范中找不到任何引用,表示对于0with 的值应该是相同的setMaxInactiveInterval().不过确实如此

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