我的 Web 应用程序中有以下场景:
- 所有资源都受到保护。
- 用户从登录屏幕开始,然后他被转发到起始页面 - index.jsp
- 会话到期前不久,用户会看到一个对话框 - 会话即将到期,单击“扩展”以延长会话,单击“取消”以取消它,并且有一个倒计时到会话到期的计时器。
如果用户没有点击任何东西,我会调用我的 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 中出于某种原因。