【发布时间】:2011-04-18 14:56:02
【问题描述】:
案例很简单:用户点击注销,进入 LogoutFilter 并:
HttpServletRequest hreq = (HttpServletRequest) request;
hreq.getSession(false).invalidate();
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.reset();
httpResponse.setHeader("Cache-Control", "no-cache");
httpResponse.setHeader("Pragma", "no-cache");
httpResponse.setHeader("Cache-Control", "no-store");
httpResponse.setHeader("Cache-Control", "must-revalidate");
httpResponse.setDateHeader("Expires", 0);
chain.doFilter(request, response);
并在页面上显示登录链接。问题很简单:会话重新创建,但用户主体已被缓存,因此没有显示登录弹出窗口并且应用程序使用缓存的主体,因为 request.getUserPrincipals() 返回非空对象。
问题很简单:有什么办法也可以删除用户主体,让浏览器在注销后要求重新登录?
【问题讨论】:
-
如何操作取决于您使用的身份验证库。库/API 必须提供一种方法。例如,在 Spring Security 中,您必须将用户转发到特定的 URL(或通过 API 模拟这样的调用)。