3

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

  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();
    }
    
    }
    

我的问题是,虽然它第一次在 IE 中显示登录屏幕,但第二次看起来会话没有失效,并且主屏幕只是在会话即将到期时不断刷新(刷新扩展了会话)。

在 Firefox 中,它甚至不会在第一次显示登录屏幕,当它进入到期 servlet 时,我在控制台中看到了错误。

你认为可能是什么问题?

PS 看起来像将这个添加到 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 中出于某种原因。

4

1 回答 1

0

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

据我了解,您的问题是
您想在会话过期后带来登录页面。为此,您可以将以下代码行添加到您的 jsp 头标记

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

会话过期后,它会将您的页面重定向到上述代码url属性中提到的 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"%>

因为不缓存任何东西。

于 2013-11-15T09:48:16.777 回答