Spring Security系列教程之會(huì)話管理處理會(huì)話過期問題
前言
在上一章節(jié)中,一一哥 給各位講解了HTTP協(xié)議、會(huì)話、URL重新、會(huì)話固定攻擊等概念,并且實(shí)現(xiàn)了對(duì)會(huì)話固定攻擊的防御攔截。
在Spring Security中,其實(shí)除了可以對(duì)會(huì)話固定攻擊進(jìn)行攔截之外,還可以對(duì)會(huì)話過期進(jìn)行處理,也就是會(huì)話可能會(huì)過期,過期了該怎么處理。接下來請(qǐng)各位跟著 壹哥 繼續(xù)學(xué)習(xí),看看會(huì)話過期時(shí)到底怎么處理的吧。
一. 會(huì)話過期
1. 會(huì)話過期概念
在處理會(huì)話過期之前,我們首先得知道啥是會(huì)話過期。
所謂的會(huì)話過期,是指當(dāng)用戶登錄網(wǎng)站后,較長(zhǎng)一段時(shí)間沒有與服務(wù)器進(jìn)行交互,將會(huì)導(dǎo)致服務(wù)器上的用戶會(huì)話數(shù)據(jù)(即session)被銷毀。此時(shí),當(dāng)用戶再次操作網(wǎng)頁(yè)時(shí),如果服務(wù)器進(jìn)行了session校驗(yàn),那么瀏覽器將會(huì)提醒用戶session超時(shí),導(dǎo)致這個(gè)問題的關(guān)鍵詞有兩個(gè):一個(gè)是「長(zhǎng)時(shí)間」,一個(gè)是「未操作」。
2. Session的超時(shí)時(shí)間
既然會(huì)話會(huì)過期,就得有個(gè)過期時(shí)間,默認(rèn)情況下,Session的過期時(shí)間是30分鐘,當(dāng)然我們可以在yml配置文件手動(dòng)修改會(huì)話的過期時(shí)間。
server: servlet: session: #會(huì)話過期時(shí)間默認(rèn)是30m過期,最少為1分鐘 timeout: 60s
另外會(huì)話的過期時(shí)間最少為1分鐘,即便我們?cè)O(shè)置為小于60秒,也會(huì)被修正為1分鐘,在Spring Boot的TomcatServletWebServerFactory類中,對(duì)此有默認(rèn)實(shí)現(xiàn),源碼如下:
private long getSessionTimeoutInMinutes() { Duration sessionTimeout = getSession().getTimeout(); if (isZeroOrLess(sessionTimeout)) { return 0; } return Math.max(sessionTimeout.toMinutes(), 1); } private boolean isZeroOrLess(Duration sessionTimeout) { return sessionTimeout == null || sessionTimeout.isNegative() || sessionTimeout.isZero(); }
3. 會(huì)話過期時(shí)的處理策略
你可能會(huì)問,萬(wàn)一會(huì)話過期了怎么辦呢?別擔(dān)心!
默認(rèn)情況下,在會(huì)話過期時(shí),Spring Security為我們提供了2種處理策略:
跳轉(zhuǎn)到某個(gè)指定的URL;
自定義過期策略。
二. 會(huì)話過期時(shí)的處理策略(一)
在上面的章節(jié)中,我給各位介紹了在會(huì)話過期時(shí),Spring Security給我們提供了2種處理策略,我們先學(xué)習(xí)第一種處理策略,即當(dāng)會(huì)話過期時(shí)跳轉(zhuǎn)到某個(gè)指定的URL,接下來請(qǐng)看代碼實(shí)現(xiàn)。
1. 配置會(huì)話過期時(shí)間
為了方便驗(yàn)證測(cè)試,我們先把會(huì)話的過期時(shí)間設(shè)置為60秒,這樣會(huì)話在很短時(shí)間內(nèi)就可以過期。
server: servlet: session: #會(huì)話過期時(shí)間默認(rèn)是30m過期,最少為1分鐘 timeout: 60s
2. 定義測(cè)試接口
接下來我們定義幾個(gè)測(cè)試接口,并且定義一個(gè)用來處理會(huì)話過期的接口“/session/inval”。
@RestController public class UserController { @GetMapping("/user/hello") public String helloUser() { return "hello, user"; } @GetMapping("/admin/hello") public String helloAdmin() { return "hello, admin"; } @GetMapping("/app/hello") public String helloApp() { return "hello, app"; } @RequestMapping("/logout") public void logout(HttpSession session){ session.invalidate(); System.out.println("logout執(zhí)行了..."); } //定義一個(gè)會(huì)話過期后要跳轉(zhuǎn)到的接口 @GetMapping("/session/invalid") public String invalid(){ return "會(huì)話過期invalid..."; } }
3. 配置跳轉(zhuǎn)到某個(gè)URL
我們還是在之前的SecurityConfig類中,進(jìn)行會(huì)話過期效果的配置實(shí)現(xiàn),主要是利用invalSessionUrl()方法來實(shí)現(xiàn)。
@EnableWebSecurity(debug = true) public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/admin/**") .hasRole("ADMIN") .antMatchers("/user/**") .hasRole("USER") .antMatchers("/app/**") .permitAll() .anyRequest() .authenticated() .and() .csrf() .disable() .formLogin() .permitAll() .and() .logout() .logoutUrl("/logout") //注銷成功,重定向到該路徑下 .logoutSuccessUrl("/login") //使得session失效 .invalidateHttpSession(true) //清除認(rèn)證信息 .clearAuthentication(true) .and() //進(jìn)行會(huì)話管理 .sessionManagement() .sessionFixation() //設(shè)置會(huì)話固定防御策略 .migrateSession() //配置會(huì)話過期策略 .invalidSessionUrl("/session/invalid"); } @Bean public PasswordEncoder passwordEncoder() { return NoOpPasswordEncoder.getInstance(); } }
4. 啟動(dòng)測(cè)試
我們把項(xiàng)目重啟,然后訪問/user/hello接口,在我們登陸認(rèn)證成功后就可以正常訪問/user/hello接口。
這時(shí)候如果我們把當(dāng)前窗口頁(yè)面關(guān)閉,經(jīng)過60秒后,會(huì)話就會(huì)過期,等再次訪問/user/hello接口,就可以看到如下效果,即跳轉(zhuǎn)到了我們指定的會(huì)話過期界面。
三. 會(huì)話過期時(shí)的處理策略(二)
我在上面說了,會(huì)話過期之后的處理策略,除了上面跳轉(zhuǎn)到指定的URL方案之外,我們還可以自定義會(huì)話過期策略,其代碼如下。
1. 自定義MyInvalSessionStrategy類
我們創(chuàng)建一個(gè)MyInvalSessionStrategy類,實(shí)現(xiàn)InvalSessionStrategy接口,在這里進(jìn)行會(huì)話過期時(shí)的處理邏輯。
//我們先定義一個(gè)處理會(huì)話過期的策略類 public class MyInvalidSessionStrategy implements InvalidSessionStrategy { @Override public void onInvalidSessionDetected(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("application/json;charset=utf-8"); response.getWriter().write("session無(wú)效"); } }
2. 配置自定義過期策略
接下來我們把上面定義的MyInvalSessionStrategy類,通過invalSessionStrategy()方法,設(shè)置自定義的會(huì)話過期策略。
//然后在配置文件中關(guān)聯(lián)處理會(huì)話過期策略 @EnableWebSecurity(debug = true) public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/admin/**") .hasRole("ADMIN") .antMatchers("/user/**") .hasRole("USER") .antMatchers("/app/**") .permitAll() .anyRequest() .authenticated() .and() .csrf() .disable() .formLogin() .permitAll() .and() .logout() .logoutUrl("/logout") //注銷成功,重定向到該路徑下 .logoutSuccessUrl("/login") //使得session失效 .invalidateHttpSession(true) //清除認(rèn)證信息 .clearAuthentication(true) .and() //進(jìn)行會(huì)話管理 .sessionManagement() .sessionFixation() //設(shè)置會(huì)話固定防御策略 .migrateSession() //配置會(huì)話過期策略 //.invalidSessionUrl("/session/invalid") //設(shè)置會(huì)話過期策略 .invalidSessionStrategy(new MyInvalidSessionStrategy()); } @Bean public PasswordEncoder passwordEncoder() { return NoOpPasswordEncoder.getInstance(); } }
至此,壹哥就帶各位實(shí)現(xiàn)了在會(huì)話過期時(shí)的代碼處理方案了,你學(xué)會(huì)了嗎?
到此這篇關(guān)于Spring Security系列教程之會(huì)話管理處理會(huì)話過期問題的文章就介紹到這了,更多相關(guān)Spring Security會(huì)話過期內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)猜數(shù)字小游戲詳解流程
猜數(shù)字是興起于英國(guó)的益智類小游戲,起源于20世紀(jì)中期,一般由兩個(gè)人或多人玩,也可以由一個(gè)人和電腦玩。游戲規(guī)則為一方出數(shù)字,一方猜,今天我們來用Java把這個(gè)小游戲?qū)懗鰜砭毦毷?/div> 2021-10-10Mybatis generator如何自動(dòng)生成代碼
這篇文章主要介紹了Mybatis generator如何自動(dòng)生成代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12Spring Junit單元測(cè)試加載配置文件失敗問題
這篇文章主要介紹了Spring Junit加載配置文件失敗問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05IDEA-SpringBoot項(xiàng)目Debug啟動(dòng)不了(卡住不動(dòng))的原因分析
這篇文章主要介紹了IDEA-SpringBoot項(xiàng)目Debug啟動(dòng)不了(卡住不動(dòng))的原因分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11使用@Value為靜態(tài)變量導(dǎo)入并使用導(dǎo)入的靜態(tài)變量進(jìn)行初始化方式
這篇文章主要介紹了使用@Value為靜態(tài)變量導(dǎo)入并使用導(dǎo)入的靜態(tài)變量進(jìn)行初始化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02詳解PowerDesigner之CDM、PDM、SQL之間轉(zhuǎn)換
這篇文章主要介紹了詳解PowerDesigner之CDM、PDM、SQL之間轉(zhuǎn)換的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-10-10最新評(píng)論