亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring Security系列教程之會話管理處理會話過期問題

 更新時間:2021年10月14日 10:47:40   作者:一一哥Sun  
會話過期,是指當(dāng)用戶登錄網(wǎng)站后,較長一段時間沒有與服務(wù)器進(jìn)行交互,將會導(dǎo)致服務(wù)器上的用戶會話數(shù)據(jù)(即session)被銷毀。這篇文章主要介紹了Spring Security系列教程之會話管理處理會話過期問題,需要的朋友可以參考下

前言

在上一章節(jié)中,一一哥 給各位講解了HTTP協(xié)議、會話、URL重新、會話固定攻擊等概念,并且實(shí)現(xiàn)了對會話固定攻擊的防御攔截。

在Spring Security中,其實(shí)除了可以對會話固定攻擊進(jìn)行攔截之外,還可以對會話過期進(jìn)行處理,也就是會話可能會過期,過期了該怎么處理。接下來請各位跟著 壹哥 繼續(xù)學(xué)習(xí),看看會話過期時到底怎么處理的吧。

一. 會話過期

1. 會話過期概念

在處理會話過期之前,我們首先得知道啥是會話過期。

所謂的會話過期,是指當(dāng)用戶登錄網(wǎng)站后,較長一段時間沒有與服務(wù)器進(jìn)行交互,將會導(dǎo)致服務(wù)器上的用戶會話數(shù)據(jù)(即session)被銷毀。此時,當(dāng)用戶再次操作網(wǎng)頁時,如果服務(wù)器進(jìn)行了session校驗,那么瀏覽器將會提醒用戶session超時,導(dǎo)致這個問題的關(guān)鍵詞有兩個:一個是「長時間」,一個是「未操作」。

2. Session的超時時間

既然會話會過期,就得有個過期時間,默認(rèn)情況下,Session的過期時間是30分鐘,當(dāng)然我們可以在yml配置文件手動修改會話的過期時間。

server:
  servlet:
    session:
      #會話過期時間默認(rèn)是30m過期,最少為1分鐘
      timeout: 60s

另外會話的過期時間最少為1分鐘,即便我們設(shè)置為小于60秒,也會被修正為1分鐘,在Spring Boot的TomcatServletWebServerFactory類中,對此有默認(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. 會話過期時的處理策略

你可能會問,萬一會話過期了怎么辦呢?別擔(dān)心!

默認(rèn)情況下,在會話過期時,Spring Security為我們提供了2種處理策略:

跳轉(zhuǎn)到某個指定的URL;

自定義過期策略。

二. 會話過期時的處理策略(一)

在上面的章節(jié)中,我給各位介紹了在會話過期時,Spring Security給我們提供了2種處理策略,我們先學(xué)習(xí)第一種處理策略,即當(dāng)會話過期時跳轉(zhuǎn)到某個指定的URL,接下來請看代碼實(shí)現(xiàn)。

1. 配置會話過期時間

為了方便驗證測試,我們先把會話的過期時間設(shè)置為60秒,這樣會話在很短時間內(nèi)就可以過期。

server:
  servlet:
    session:
      #會話過期時間默認(rèn)是30m過期,最少為1分鐘
      timeout: 60s

2. 定義測試接口

接下來我們定義幾個測試接口,并且定義一個用來處理會話過期的接口“/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í)行了...");
    }
 
    //定義一個會話過期后要跳轉(zhuǎn)到的接口
    @GetMapping("/session/invalid")
    public String invalid(){
 
        return "會話過期invalid...";
    }
 
}

3. 配置跳轉(zhuǎn)到某個URL

我們還是在之前的SecurityConfig類中,進(jìn)行會話過期效果的配置實(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)行會話管理
                .sessionManagement()
                .sessionFixation()
                //設(shè)置會話固定防御策略
                .migrateSession()
                //配置會話過期策略
                .invalidSessionUrl("/session/invalid");
    }
 
    @Bean
    public PasswordEncoder passwordEncoder() {
 
        return NoOpPasswordEncoder.getInstance();
    }
 
}

4. 啟動測試

我們把項目重啟,然后訪問/user/hello接口,在我們登陸認(rèn)證成功后就可以正常訪問/user/hello接口。

這時候如果我們把當(dāng)前窗口頁面關(guān)閉,經(jīng)過60秒后,會話就會過期,等再次訪問/user/hello接口,就可以看到如下效果,即跳轉(zhuǎn)到了我們指定的會話過期界面。

三. 會話過期時的處理策略(二)

我在上面說了,會話過期之后的處理策略,除了上面跳轉(zhuǎn)到指定的URL方案之外,我們還可以自定義會話過期策略,其代碼如下。

1. 自定義MyInvalSessionStrategy類

我們創(chuàng)建一個MyInvalSessionStrategy類,實(shí)現(xiàn)InvalSessionStrategy接口,在這里進(jìn)行會話過期時的處理邏輯。

//我們先定義一個處理會話過期的策略類
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無效");
    }
 
}

2. 配置自定義過期策略

接下來我們把上面定義的MyInvalSessionStrategy類,通過invalSessionStrategy()方法,設(shè)置自定義的會話過期策略。

//然后在配置文件中關(guān)聯(liá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)行會話管理
                .sessionManagement()
                .sessionFixation()
                //設(shè)置會話固定防御策略
                .migrateSession()
                //配置會話過期策略
                //.invalidSessionUrl("/session/invalid")
                //設(shè)置會話過期策略
                .invalidSessionStrategy(new MyInvalidSessionStrategy());
    }
 
    @Bean
    public PasswordEncoder passwordEncoder() {
 
        return NoOpPasswordEncoder.getInstance();
    }
 
}

至此,壹哥就帶各位實(shí)現(xiàn)了在會話過期時的代碼處理方案了,你學(xué)會了嗎?

到此這篇關(guān)于Spring Security系列教程之會話管理處理會話過期問題的文章就介紹到這了,更多相關(guān)Spring Security會話過期內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)現(xiàn)猜數(shù)字小游戲詳解流程

    Java實(shí)現(xiàn)猜數(shù)字小游戲詳解流程

    猜數(shù)字是興起于英國的益智類小游戲,起源于20世紀(jì)中期,一般由兩個人或多人玩,也可以由一個人和電腦玩。游戲規(guī)則為一方出數(shù)字,一方猜,今天我們來用Java把這個小游戲?qū)懗鰜砭毦毷?/div> 2021-10-10
  • Mybatis generator如何自動生成代碼

    Mybatis generator如何自動生成代碼

    這篇文章主要介紹了Mybatis generator如何自動生成代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-12-12
  • Servlet中配置和使用過濾器的步驟記錄

    Servlet中配置和使用過濾器的步驟記錄

    這篇文章主要介紹了在Servlet中配置和使用過濾器的方法,包括創(chuàng)建過濾器類、配置過濾器以及在Web應(yīng)用中使用過濾器等步驟,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-01-01
  • Java?synchronized與死鎖深入探究

    Java?synchronized與死鎖深入探究

    這篇文章主要介紹了Java?synchronized與死鎖,Java中提供了synchronized關(guān)鍵字,將可能引發(fā)安全問題的代碼包裹在synchronized代碼塊中,表示這些代碼需要進(jìn)行線程同步
    2023-01-01
  • Java JVM程序指令碼實(shí)例解析

    Java JVM程序指令碼實(shí)例解析

    這篇文章主要介紹了Java JVM程序指令碼實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • Spring Junit單元測試加載配置文件失敗問題

    Spring Junit單元測試加載配置文件失敗問題

    這篇文章主要介紹了Spring Junit加載配置文件失敗問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • IDEA-SpringBoot項目Debug啟動不了(卡住不動)的原因分析

    IDEA-SpringBoot項目Debug啟動不了(卡住不動)的原因分析

    這篇文章主要介紹了IDEA-SpringBoot項目Debug啟動不了(卡住不動)的原因分析,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    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)行初始化方式

    這篇文章主要介紹了使用@Value為靜態(tài)變量導(dǎo)入并使用導(dǎo)入的靜態(tài)變量進(jìn)行初始化方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Java的異常體系以及File類構(gòu)造方法詳解

    Java的異常體系以及File類構(gòu)造方法詳解

    這篇文章主要為大家介紹了Java的異常體系以及File類構(gòu)造方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • 詳解PowerDesigner之CDM、PDM、SQL之間轉(zhuǎn)換

    詳解PowerDesigner之CDM、PDM、SQL之間轉(zhuǎn)換

    這篇文章主要介紹了詳解PowerDesigner之CDM、PDM、SQL之間轉(zhuǎn)換的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-10-10

最新評論