【问题标题】:Session timeout confusion - session.setMaxInactiveInterval(0)会话超时混淆 - session.setMaxInactiveInterval(0)
【发布时间】: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-config session-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


【解决方案1】:

Servlet Specification 关于会话超时状态的章节

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

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

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

【讨论】:

  • 感谢您的规范链接(如果可以的话,我只会为您投票)。我假设由于 0setMaxInactiveInterval 的规范中未定义,但仅适用于 <session-config> Glassfish 正确实现了它(但根据 JavaDoc 并不完美),因此它不是错误。无论如何,您可能会给出非玻璃鱼员工可以给出的最佳答案,因此会接受您的答案。再给你一次坦克。
【解决方案2】:

这已经超时并且失效了

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

所以这是正确的错误信息。 (请参阅head first book以供进一步参考。)

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

【讨论】:

  • 是的,我知道 HF - servlets and JSP 表明对于参数0 会话将立即失效,但在官方文档docs.oracle.com/javaee/7/api/javax/servlet/http/… 中我们可以读到“ 或更小的间隔值表示会话不应超时。"这是我困惑的根源。
猜你喜欢
  • 2014-11-06
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 2013-04-12
  • 2015-11-25
  • 2013-09-09
  • 2011-07-31
  • 1970-01-01
相关资源
最近更新 更多