# 处理注销

## 注销 爪哇/ Kotlin 配置

当使用`[WebSecurityConfigurerAdapter](https://docs.spring.io/spring-security/site/docs/5.6.2/api/org/springframework/security/config/annotation/web/configuration/WebSecurityConfigurerAdapter.html)`时，将自动应用注销功能。默认情况下，访问 URL`/logout`将通过以下方式将用户注销：

* 使 HTTP会话无效

* 清除所有已配置的 RememberMe 身份验证

* 清除`SecurityContextHolder`

* 重定向到`/login?logout`

然而，与配置登录功能类似，你还可以使用各种选项来进一步定制你的注销需求：

例 1。注销配置

Java

```
protected void configure(HttpSecurity http) throws Exception {
    http
        .logout(logout -> logout                                                (1)
            .logoutUrl("/my/logout")                                            (2)
            .logoutSuccessUrl("/my/index")                                      (3)
            .logoutSuccessHandler(logoutSuccessHandler)                         (4)
            .invalidateHttpSession(true)                                        (5)
            .addLogoutHandler(logoutHandler)                                    (6)
            .deleteCookies(cookieNamesToClear)                                  (7)
        )
        ...
}
```

Kotlin

```
override fun configure(http: HttpSecurity) {
    http {
        logout {
            logoutUrl = "/my/logout"                              (1)
            logoutSuccessUrl = "/my/index"                        (2)
            logoutSuccessHandler = customLogoutSuccessHandler     (3)
            invalidateHttpSession = true                          (4)
            addLogoutHandler(logoutHandler)                       (5)
            deleteCookies(cookieNamesToClear)                     (6)
        }
    }
}
```

|**1**|提供注销支持。<br/>当使用`WebSecurityConfigurerAdapter`时，会自动应用此功能。|
|-----|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|**2**|触发注销发生的 URL（默认值是`/logout`）。<br/>如果启用了 CSRF 保护（默认值），那么请求也必须是 POST。<br/>有关更多信息，请咨询[Javadoc](https://docs.spring.io/spring-security/site/docs/5.6.2/api/org/springframework/security/config/annotation/web/configurers/LogoutConfigurer.html#logoutUrl-java.lang.String-)。|
|**3**|发生注销后要重定向到的 URL。<br/>默认值为`/login?logout`。<br/>有关更多信息，请咨询[Javadoc](https://docs.spring.io/spring-security/site/docs/5.6.2/api/org/springframework/security/config/annotation/web/configurers/LogoutConfigurer.html#logoutSuccessUrl-java.lang.String-)。|
|**4**|让我们指定一个自定义`LogoutSuccessShandler`。<br/>如果指定了这个，`logoutSuccessUrl()`将被忽略。<br/>有关更多信息，请咨询[Javadoc](https://docs.spring.io/spring-security/site/docs/5.6.2/api/org/springframework/security/config/annotation/web/configurers/LogoutConfigurer.html#logoutSuccessHandler-org.springframework.security.web.authentication.logout.LogoutSuccessHandler-)。|
|**5**|指定是否在注销时使`HttpSession`无效。<br/>默认情况下这是**true**。<br/>配置了封面下的`SecurityContextLogouthandler`。<br/>有关更多信息，请咨询[Javadoc](https://docs.spring.io/spring-security/site/docs/5.6.2/api/org/springframework/security/config/annotation/web/configurers/LogoutConfigurer.html#invalidateHttpSession-boolean-)。|
|**6**|添加`LogoutHandler`。默认情况下，`SecurityContextLogoutHandler`是作为最后一个`LogoutHandler`添加的。|
|**7**|允许指定注销成功后要删除的 cookie 的名称。<br/>这是显式添加`CookieClearingLogoutHandler`的快捷方式。|

|   |当然，也可以使用 XML 命名空间符号来配置注销。<br/>请参阅 Spring Security XML 命名空间小节中[注销元素](../appendix/namespace/http.html#nsa-logout)的文档以获取更多详细信息。|
|---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|

通常，为了定制注销功能，可以添加`[LogoutHandler](https://docs.spring.io/spring-security/site/docs/5.6.2/api/org/springframework/security/web/authentication/logout/LogoutHandler.html)`和/或`[LogoutSuccessHandler](https://docs.spring.io/spring-security/site/docs/5.6.2/api/org/springframework/security/web/authentication/logout/LogoutSuccessHandler.html)`实现。对于许多常见的场景，在使用 Fluent API 时，这些处理程序会被隐藏起来。

## 注销 XML 配置

`logout`元素通过导航到特定的 URL，增加了对注销的支持。默认的注销 URL 是`/logout`，但你可以使用`logout-url`属性将其设置为其他内容。有关其他可用属性的更多信息，请参见名称空间附录。

## LogoutHandler

通常，`[LogoutHandler](https://docs.spring.io/spring-security/site/docs/5.6.2/api/org/springframework/security/web/authentication/logout/LogoutHandler.html)`实现表示能够参与注销处理的类。预计将调用它们来执行必要的清理。因此，他们不应该抛出例外。提供了各种实现方式：

* [坚持以 DREMEMBERMESERVICE 为基础](https://docs.spring.io/spring-security/site/docs/5.6.2/api/org/springframework/security/web/authentication/rememberme/PersistentTokenBasedRememberMeServices.html)

* [TokenBaseDreMemberMeservices ](https://docs.spring.io/spring-security/site/docs/5.6.2/api/org/springframework/security/web/authentication/rememberme/TokenBasedRememberMeServices.html)

* [CookieclearingLogouthandler ](https://docs.spring.io/spring-security/site/docs/5.6.2/api/org/springframework/security/web/authentication/logout/CookieClearingLogoutHandler.html)

* [CSRFLOGOUTHANDLER ](https://docs.spring.io/spring-security/site/docs/5.6.2/api/org/springframework/security/web/csrf/CsrfLogoutHandler.html)

* [SecurityContextLogouthandler ](https://docs.spring.io/spring-security/site/docs/5.6.2/api/org/springframework/security/web/authentication/logout/SecurityContextLogoutHandler.html)

* [HeaderWriterLogouthandler ](https://docs.spring.io/spring-security/site/docs/5.6.2/api/org/springframework/security/web/authentication/logout/HeaderWriterLogoutHandler.html)

详情请见[Remember-Me 接口和实现](rememberme.html#remember-me-impls)。

与其直接提供`LogoutHandler`实现，Fluent API 还提供了一些快捷方式，这些快捷方式在封面下提供了相应的`LogoutHandler`实现。例如：`deleteCookies()`允许指定注销成功后要删除的一个或多个 Cookie 的名称。与添加`CookieClearingLogoutHandler`相比，这是一个快捷方式。

## LogoutSuccessHandler

`LogoutSuccessHandler`在`LogoutFilter`成功注销后调用`LogoutSuccessHandler`，以处理例如重定向或转发到适当的目的地。请注意，该接口几乎与`LogoutHandler`相同，但可能会引发异常。

提供了以下实现方式：

* [SimpleurlLogoutSuccessShandler ](https://docs.spring.io/spring-security/site/docs/5.6.2/api/org/springframework/security/web/authentication/logout/SimpleUrlLogoutSuccessHandler.html)

* HttpStatusReturningLogOutSuccessShandler

如上所述，你不需要直接指定`SimpleUrlLogoutSuccessHandler`。相反，Fluent API 通过设置`logoutSuccessUrl()`提供了一个快捷方式。这将在封面下设置`SimpleUrlLogoutSuccessHandler`。注销发生后，提供的 URL 将被重定向到该 URL。默认值为`/login?logout`。

在 REST API 类型场景中，`HttpStatusReturningLogoutSuccessHandler`可能很有趣。这`LogoutSuccessHandler`不是在成功注销后重定向到 URL，而是允许你提供一个要返回的普通 HTTP 状态代码。如果未配置状态代码 200，将在默认情况下返回。

## 更多与注销相关的参考资料

* [注销处理](#ns-logout)

* [测试注销](../test/mockmvc/logout.html#test-logout)

* [HttpServletRequest.logout（）](../integrations/servlet-api.html#servletapi-logout)

* [Remember-Me 接口和实现](rememberme.html#remember-me-impls)

* [注销](../exploits/csrf.html#servlet-considerations-csrf-logout)中的 csrf 警告

* section[单次注销](cas.html#cas-singlelogout)（CAS 协议）

* Spring Security XML 名称空间部分中[注销元素](../appendix/namespace/http.html#nsa-logout)的文档

[Run-As](runas.html)[认证事件](events.html)

