【问题标题】:How to perform logout programmatically in spring 3如何在 Spring 3 中以编程方式执行注销
【发布时间】:2013-09-28 05:49:37
【问题描述】:

我有一个用于注销的弹簧配置,如下所示:

<logout logout-url="/abc/logout"
            logout-success-url="/abc/login"/>

现在我想以编程方式注销。我如何在 Spring 3 中实现这一点。我需要从具有以下定义的控制器之一注销。目前我正在做类似以下的事情......这是个好主意..

 public void suppressUserProfile() {
   //...
   return "redirect:/abc/logout"; 
 }

【问题讨论】:

  • 重定向会起作用,但为什么不简单地将HttpSevletRequest 添加为参数并调用logout 方法。 (只能在带有 Spring Security 3.2(目前在 RC1 中)的 Servlet 3.0 环境中工作。

标签: spring spring-security spring-3


【解决方案1】:

这取决于。如果您的应用程序可以将已注销的用户放置在“您已注销”页面上,那么这可能没问题。但是您不能确定您的用户是否真的会被注销(例如,如果浏览器抑制了重定向)。

您可以通过编程方式退出:

public void logout(HttpServletRequest request, HttpServletResponse response) {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
          if (auth != null){    
             new SecurityContextLogoutHandler().logout(request, response, auth);
          }
        SecurityContextHolder.getContext().setAuthentication(null);
    }

正如@LateralFractal 指出的那样,如果您没有更改SecurityContextLogoutHandler 的默认值(请参阅https://github.com/spring-projects/spring-security/blob/3.2.x/web/src/main/java/org/springframework/security/web/authentication/logout/SecurityContextLogoutHandler.java#L96),您可以将其缩减为

public void logout(HttpServletRequest request) {
    new SecurityContextLogoutHandler().logout(request, null, null);
}

甚至(虽然有点丑)

public void logout() {
    HttpServletRequest request =
        ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes())
            .getRequest();
    new SecurityContextLogoutHandler().logout(request, null, null);

有关获取HttpServletRequest 的一些背景信息,请参阅https://stackoverflow.com/a/9767869/1686330

【讨论】:

  • 或者,如果处理程序默认值仍然适用,new SecurityContextLogoutHandler().logout(request, null, null) 将做同样的事情。
  • @LateralFractal 感谢您指出这一点。改变了我的答案。
【解决方案2】:
HttpSession session = request.getSession();
session.invalidate();
SecurityContextHolder.clearContext();

【讨论】:

  • 这确实是the way Spring Security does it。最好使用request.getSession(false),然后检查会话是否为空,以避免可能出现NullPointerException
猜你喜欢
  • 2019-11-01
  • 2014-04-17
  • 2012-03-22
  • 1970-01-01
  • 1970-01-01
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 2017-01-15
相关资源
最近更新 更多