欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2021年10月14日 10:47:40   作者:一一哥Sun  
會(huì)話過期,是指當(dāng)用戶登錄網(wǎng)站后,較長(zhǎng)一段時(shí)間沒有與服務(wù)器進(jìn)行交互,將會(huì)導(dǎo)致服務(wù)器上的用戶會(huì)話數(shù)據(jù)(即session)被銷毀。這篇文章主要介紹了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ù)字小游戲詳解流程

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

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

    Mybatis generator如何自動(dòng)生成代碼

    這篇文章主要介紹了Mybatis generator如何自動(dòng)生成代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    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ì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Spring Junit單元測(cè)試加載配置文件失敗問題

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

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

    IDEA-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)行初始化方式

    這篇文章主要介紹了使用@Value為靜態(tài)變量導(dǎo)入并使用導(dǎo)入的靜態(tài)變量進(jìn)行初始化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    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

最新評(píng)論