【问题标题】:how to clear user principals after logout?注销后如何清除用户主体?
【发布时间】: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 模拟这样的调用)。

标签: java jaas principal


【解决方案1】:
【解决方案2】:

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

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

【讨论】:

  • 我也试过这个变种:HttpServletResponse response = (HttpServletResponse) getContext().getExternalContext().getResponse(); HttpSession 会话 = (HttpSession) getRequest().getSession(false); session.invalidate(); response.setContentLength(0);尝试 { response.sendRedirect(logoutUrl); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace();但没有运气:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-13
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
  • 2015-01-16
  • 1970-01-01
相关资源
最近更新 更多