最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

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

一. 會(huì)話過(guò)期

1. 會(huì)話過(guò)期概念

在處理會(huì)話過(guò)期之前,我們首先得知道啥是會(huì)話過(guò)期。

所謂的會(huì)話過(guò)期,是指當(dāng)用戶登錄網(wǎng)站后,較長(zhǎng)一段時(shí)間沒(méi)有與服務(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è)問(wèn)題的關(guān)鍵詞有兩個(gè):一個(gè)是「長(zhǎng)時(shí)間」,一個(gè)是「未操作」。

2. Session的超時(shí)時(shí)間

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

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

另外會(huì)話的過(guò)期時(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ì)話過(guò)期時(shí)的處理策略

你可能會(huì)問(wèn),萬(wàn)一會(huì)話過(guò)期了怎么辦呢?別擔(dān)心!

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

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

自定義過(guò)期策略。

二. 會(huì)話過(guò)期時(shí)的處理策略(一)

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

1. 配置會(huì)話過(guò)期時(shí)間

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

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

2. 定義測(cè)試接口

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

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

我們還是在之前的SecurityConfig類中,進(jìn)行會(huì)話過(guò)期效果的配置實(shí)現(xiàn),主要是利用invalSessionUrl()方法來(lái)實(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ì)話過(guò)期策略
                .invalidSessionUrl("/session/invalid");
    }
 
    @Bean
    public PasswordEncoder passwordEncoder() {
 
        return NoOpPasswordEncoder.getInstance();
    }
 
}

4. 啟動(dòng)測(cè)試

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

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

三. 會(huì)話過(guò)期時(shí)的處理策略(二)

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

1. 自定義MyInvalSessionStrategy類

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

//我們先定義一個(gè)處理會(huì)話過(guò)期的策略類
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. 配置自定義過(guò)期策略

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

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

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

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

相關(guān)文章

  • Java終止線程的兩種方法

    Java終止線程的兩種方法

    本文主要介紹了Java終止線程的兩種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 如何解決SpringBoot定時(shí)任務(wù)報(bào)錯(cuò)Unexpected error occurred in scheduled task問(wèn)題

    如何解決SpringBoot定時(shí)任務(wù)報(bào)錯(cuò)Unexpected error occurred 

    這篇文章主要介紹了如何解決SpringBoot定時(shí)任務(wù)報(bào)錯(cuò)Unexpected error occurred in scheduled task問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • IDEA中配置Java反編譯工具javap -c的使用

    IDEA中配置Java反編譯工具javap -c的使用

    本文主要介紹了IDEA中配置Java反編譯工具javap -c的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Java?C++算法題解leetcode801使序列遞增的最小交換次數(shù)

    Java?C++算法題解leetcode801使序列遞增的最小交換次數(shù)

    這篇文章主要為大家介紹了Java?C++題解leetcode801使序列遞增的最小交換次數(shù)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Java ArrayList.toArray(T[]) 方法的參數(shù)類型是 T 而不是 E的原因分析

    Java ArrayList.toArray(T[]) 方法的參數(shù)類型是 T 而不是 E的原因分析

    這篇文章主要介紹了Java ArrayList.toArray(T[]) 方法的參數(shù)類型是 T 而不是 E的原因分析的相關(guān)資料,需要的朋友可以參考下
    2016-04-04
  • jpa使用注解生成表時(shí)無(wú)外鍵問(wèn)題及解決

    jpa使用注解生成表時(shí)無(wú)外鍵問(wèn)題及解決

    這篇文章主要介紹了jpa使用注解生成表時(shí)無(wú)外鍵問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java中Maven的依賴管理問(wèn)題小結(jié)

    Java中Maven的依賴管理問(wèn)題小結(jié)

    這篇文章主要介紹了Java中Maven的依賴管理,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-05-05
  • 聊聊Spring MVC JSON數(shù)據(jù)交互的問(wèn)題

    聊聊Spring MVC JSON數(shù)據(jù)交互的問(wèn)題

    我們?cè)陂_(kāi)發(fā)中后端經(jīng)常需要接受來(lái)自于前端傳遞的Json字符串?dāng)?shù)據(jù),怎么把Json字符串轉(zhuǎn)換為Java對(duì)象呢?下面小編給大家?guī)?lái)了Spring MVC JSON數(shù)據(jù)交互的問(wèn)題,感興趣的朋友一起看看吧
    2021-10-10
  • MyEclipse 2016 CI 4新增BootStrap模板

    MyEclipse 2016 CI 4新增BootStrap模板

    MyEclipse2016是一款全球使用最為廣泛的企業(yè)級(jí)開(kāi)發(fā)環(huán)境程序,這篇文章主要介紹了MyEclipse 2016 CI 4新增BootStrap模板的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • MyBatis使用注解開(kāi)發(fā)實(shí)現(xiàn)過(guò)程詳解

    MyBatis使用注解開(kāi)發(fā)實(shí)現(xiàn)過(guò)程詳解

    這篇文章主要介紹了MyBatis使用注解開(kāi)發(fā)實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03

最新評(píng)論

广宁县| 桦南县| 洛川县| 辰溪县| 调兵山市| 阳朔县| 澄城县| 罗甸县| 南溪县| 襄汾县| 宁阳县| 临桂县| 郓城县| 汨罗市| 治多县| 广元市| 赤城县| 淳化县| 丰原市| 固阳县| 乡城县| 绍兴县| 玛纳斯县| 南澳县| 合江县| 林口县| 沾益县| 常山县| 佛坪县| 邳州市| 交口县| 舞钢市| 台北县| 达孜县| 霍州市| 延庆县| 南召县| 千阳县| 阳原县| 永吉县| 罗山县|