0

以下是我的代码。

在这种情况下,会话会立即超时,因为我们说的是“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。感谢您的帮助

4

2 回答 2

3

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

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

于 2013-10-25T11:26:51.203 回答
1
     session.setMaxInactiveInterval(0);

通过文档

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

因此,如果您将其归零,它将永远不会超时。如果你尝试

         session.setMaxInactiveInterval(10);

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

于 2013-10-25T09:41:14.210 回答