我是JEE的新手,这让我很困惑。根据{{3}}文档
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
的错误感兴趣。
答案 0 :(得分:5)
会话超时的Servlet Specification章节说明
根据定义,如果会话的超时时间设置为-1,则 会话永远不会过期。
所以GlasshFish似乎已经涵盖了这一点。我在规范中找不到任何引用,对0
setMaxInactiveInterval()
的值应该是相同的。但它确实说
session-config
定义此Web的会话参数 应用。子元素session-timeout
定义默认值 在此Web中创建的所有会话的会话超时间隔 应用。指定的超时必须以整体表示 分钟数。 如果超时为0或更少,则容器会确保 会话的默认行为永远不会超时。如果这个元素 如果未指定,则容器必须设置其默认超时时间。
答案 1 :(得分:0)
这已经超时并且无效
session.setMaxInactiveInterval(0); // mean inactive immediately
所以这是正确的错误信息。 (请参阅第一本书以供进一步参考。)
您正在尝试访问不存在的对象值。它已经被销毁了