我是JEE的新手,这让我感到困惑。根据 HttpSession。html#setMaxInactiveInterval(int 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

    }
}

在Glassfish4.0上使用似乎证实了教科书中的理论而不是较新的官方文档,因为它返回 HTTP状态500-内部服务器错误 带有错误消息

java.lang.IllegalStateException: getAttribute: Session already invalidated

这是怎么回事?这是Glassfish4.0错误还是文档错误?或者,也许有第三种选择?


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

有帮助吗?

解决方案

Servlet规范 会议超时一章

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

所以GlasshFish似乎已经复盖了。我在规范中找不到任何引用,说对于一个值也应该是如此 0setMaxInactiveInterval().然而它确实说

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

其他提示

这已经是超时和无效

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top