14

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

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

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

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

2 回答 2

19

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

以编程方式,您可以通过以下方式注销:

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. _

于 2013-09-23T11:10:31.030 回答
4
HttpSession session = request.getSession();
session.invalidate();
SecurityContextHolder.clearContext();
于 2019-08-08T14:02:01.503 回答