Servlet的会话MaxInactiveInterval setter和getter方法不起作用

时间:2013-10-25 08:07:27

标签: servlets session-timeout

以下是我的代码。

在此, 会话超时立即,因为我们说, “0秒不活动后超时”。

因此 session.getAttribute(“foo”)必须提供异常。但代码可以毫无故障地工作,就好像会话根本没有超时一样。

 public void doGet(HttpServletRequest request, HttpServletResponse response)
                                                           throws IOException {
         response.setContentType(“text/html”);
         PrintWriter out = response.getWriter();
         HttpSession session = request.getSession();
         session.setAttribute(“foo”, “42”);
         session.setMaxInactiveInterval(0);
         String foo = (String) session.getAttribute(“foo”);
         if (session.isNew()) {
            out.println(“This is a new session.”); 
          } else {
            out.println(“Welcome back!”);
        }
        out.println(“Foo: “ + foo);
 }

当我使用 getMaxInactiveInterval()时,问题类似。

当我第一次明确调用 setMaxInactiveInterval()时,它会给出正确的结果。但是当它没有以编程方式设置时, getMaxInactiveInterval 不显示默认会话超时,即30分钟。相反,它总是给出 60秒作为结果。

我的服务器是Apache Tomcat 7。 谢谢你的帮助

2 个答案:

答案 0 :(得分:2)

Tomcat使用后台线程过期会话。默认情况下,该线程仅每分钟检查一次到期的会话。

如果getMaxInactiveInterval()未返回默认值1800(30分钟),那么某处某处已更改默认值。

答案 1 :(得分:1)

     session.setMaxInactiveInterval(0);

按文档

  

指定servlet容器使此会话失效之前的客户端请求之间的时间(以秒为单位)。   间隔值为零或更小表示会话永远不会超时。   参数:   interval - 指定秒数的整数

所以,如果你把它归零,它就永远不会超时。如果你试试

         session.setMaxInactiveInterval(10);

它将在10秒后过期。请注意,web.xml中还有一个值,表示以分钟为单位的超时,以及以编程方式设置的值,即以秒为单位的间隔。