本文將介紹在Spring Security框架下如何實現用戶的"退出"logout的功能。其實這是一個很是簡單的功能,我見過不少的程序員在使用了Spring Security以後,仍然去本身寫controller方法實現logout功能,這種作法就好像耕地,你有機械設備你不用,你非要用牛。html
其實使用Spring Security進行logout很是簡單,只須要在spring Security配置類配置項上加上這樣一行代碼:http.logout()。關於spring Security配置類的其餘不少實現、如:HttpBasic模式、formLogin模式、自定義登陸驗證結果、使用權限表達式、session會話管理,在本號的以前的文章已經都寫過了。本節的核心內容就是在原有配置的基礎上,加上這樣一行代碼:http.logout()。程序員
@Configuration @EnableWebSecurity public class SecSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(final HttpSecurity http) throws Exception { http.logout(); } }
加上logout配置以後,在你的「退出」按鈕上使用/logtou做爲請求登出的路徑。spring
<a href="/logout">退出</a>
logout功能咱們就完成了。實際上的核心代碼只有兩行。springboot
雖然咱們簡簡單單的實現了logout功能,是否是還不足夠放心?咱們下面就來看一下Spring Security默認在logout過程當中幫咱們作了哪些動做。cookie
一般對於一個應用來說,以上動做就是logout功能所須要具有的功能了。session
雖然Spring Security默認使用了/logout做爲退出處理請求路徑,登陸頁面做爲退出以後的跳轉頁面。這符合絕大多數的應用的開發邏輯,但有的時候咱們須要一些個性化設置,以下:框架
http.logout() .logoutUrl("/signout") .logoutSuccessUrl("/aftersignout.html") .deleteCookies("JSESSIONID")
若是上面的個性化配置,仍然知足不了您的應用需求。可能您的應用須要在logout的時候,作一些特殊動做,好比登陸時長計算,清理業務相關的數據等等。你能夠經過實現LogoutSuccessHandler 接口來實現你的業務邏輯。ide
@Component public class MyLogoutSuccessHandler implements LogoutSuccessHandler { @Override public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { //這裏書寫你本身的退出業務邏輯 // 重定向到登陸頁 response.sendRedirect("/login.html"); } }
而後進行配置使其生效,核心代碼就是一行logoutSuccessHandler。注意logoutSuccessUrl不要與logoutSuccessHandler一塊兒使用,不然logoutSuccessHandler將失效。學習
@Configuration @EnableWebSecurity public class SecSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private MyLogoutSuccessHandler myLogoutSuccessHandler; @Override protected void configure(final HttpSecurity http) throws Exception { http.logout() .logoutUrl("/signout") //.logoutSuccessUrl(``"/aftersignout.html"``) .deleteCookies("JSESSIONID") //自定義logoutSuccessHandler .logoutSuccessHandler(myLogoutSuccessHandler); } }