servlet中的会话失效

时间:2012-12-19 17:39:55

标签: java jsp web-applications servlets

我的网络应用程序中有以下场景:

  1. 所有资源都受到保护。
  2. 用户从登录屏幕开始,然后转发到起始页面 - index.jsp
  3. 会话到期前的一小段时间,用户会看到一个对话框 - 会话即将过期,单击“扩展”以扩展会话,“取消”取消该会话,并且有一个倒计时到会话到期的计时器。
  4. 如果用户没有点击任何内容,我会调用应该使会话过期的servlet并转发到index.jsp(应该触发登录屏幕)。 以下是使会话无效的代码:

    @Override
     protected void doGet(HttpServletRequest request, HttpServletResponse response) {
    HttpSession session = request.getSession(false);
    
    if(session != null)
        session.invalidate();
    
    try {
        request.getRequestDispatcher("/jsp/index.jsp").forward(request,response);
    } catch (Exception e) {
        e.printStackTrace();
    }
    
    }
    
  5. 我的问题是,虽然它第一次在IE中显示登录屏幕,但第二次看起来会话没有失效,主屏幕只是在会话即将到期时保持刷新(刷新扩展了会话)。

    在firefox中,它甚至没有显示第一次登录屏幕,我看到控制台中的错误进入到期servlet。

    您认为这可能是什么问题?

    P.S。 看起来像在IE中帮助添加这个servlet:

      // Set standard HTTP/1.1 no-cache headers.
      response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
    
      // Set IE extended HTTP/1.1 no-cache headers (use addHeader).
      response.addHeader("Cache-Control", "post-check=0, pre-check=0");
    
      // Set standard HTTP/1.0 no-cache header.
      response.setHeader("Pragma", "no-cache");
    

    我需要进一步调查FF。

    好的,回答关于FF的问题,问题是我在异步调用会话过期并且内部有重定向,所以这在FF中不起作用但在IE中出于某种原因。

1 个答案:

答案 0 :(得分:0)

我知道为时已晚。但它可能对另一个人有所帮助。

据我所知,你的问题是 您希望在会话过期后带上登录页面。为此,您可以将以下代码行添加到您的jsp head标签中

<head><meta http-equiv="refresh" content="${pageContext.session.maxInactiveInterval};url=login"></head>

会话过期后,它会将您的网页重定向到上面代码 url 属性中提到的网址。

您还可以将以下代码添加到JSP页面的顶部

<%
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control",
        "no-cache, no-store, must-revalidate, private, max-age=0");
response.setDateHeader("Expires", 0);
%>
<%@page session="true"%>

表示不缓存任何内容。