0

案例很简单:用户单击注销,转到 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() 返回非空对象。

问题很简单:有没有办法删除用户主体,所以浏览器在注销后要求再次登录?

4

2 回答 2

0

不仅仅是在注销时清除缓存,而是为您的应用程序设置一个过滤器,该过滤器始终将这些元值设置为响应,用于对应用程序中页面的每个请求。这样,您的任何页面都不会被缓存。清除浏览器缓存并重试。这能解决什么问题吗?

于 2011-04-18T15:39:35.540 回答
0

当用户注销时,我会考虑在您使他们的会话无效后将他们(使用 302 重定向)重定向到“注销”页面。“希望”会阻止 request.getUserPrincipals() 返回任何内容。

顺便说一句,您正在执行的缓存工作对您的 Web 应用程序缓存没有任何作用。您在此处指定的是 Web 客户端和 Web 代理应如何考虑缓存该特定请求。因此,这些值在请求离开您的服务器并“进入野外”后使用。

于 2011-04-18T16:25:18.427 回答