首頁  >  文章  >  Java  >  SpringBoot2.x版本中使用SpringSession常見問題怎麼解決

SpringBoot2.x版本中使用SpringSession常見問題怎麼解決

王林
王林轉載
2023-05-17 14:34:461121瀏覽

SpringBoot2.x SpringSession踩坑

Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating brnameworkname. autoconfigure.session.SessionAutoConfiguration$ServletSessionRepositoryValidator': Invocation of init method failed; nested exception is org.springframework.boot.auto 'redis' )

這是因為缺少了spring-session-data-redis依賴。

關於SpringBoot2.X中,引用SpringSession,同時使用Redis儲存快取資料需要進行如下配置:

 <!--SpringSession依赖-->
 <dependency>
  <groupId>org.springframework.session</groupId>
  <artifactId>spring-session-core</artifactId>
 </dependency>
 <!--SpringSessionRedis依赖-->
 <dependency>
  <groupId>org.springframework.session</groupId>
  <artifactId>spring-session-data-redis</artifactId>
 </dependency>
#使用使用Redis缓存session数据
spring.session.store-type=REDIS
#Redis服务器地址
spring.redis.host=127.0.0.1
#Redis服务器端口号
spring.redis.port=6379

總結:

在SpringBoot2.x的版本中,引用spring-session-core時,不是對spring-session-data-redis進行加載,需要使用者自行添加關於spring-session與redis的關聯依賴。

springboot 2.x 踩坑-跨域導致session問題

目前IT界主流前後端分離,但是在分離過程中一定會存在跨域的問題。

什麼是跨域?

是指瀏覽器從一個網域的網頁去請求另一個網域的資源時,網域、連接埠、協定任一不同,都是跨網域。

遇到的場景

當我們用springboot shrio vue 來做後台管理的專案時,無法取得shiroSession目前登入的用戶,

於是我們就排查,網路上說在跨域時讓session通過就可以了

後端

@Configuration
public class CorsConfig {
    private CorsConfiguration buildConfig() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.setAllowCredentials(true);
        // 允许任何域名使用
        corsConfiguration.addAllowedOrigin("*");
        // 允许任何头
        corsConfiguration.addAllowedHeader("*");
        // 允许任何方法(post、get等)
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.setMaxAge(3600L);
        return corsConfiguration;
    }
    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        // 对接口配置跨域设置
        source.registerCorsConfiguration("/**", buildConfig());
        return new CorsFilter(source);
    }
}

前端

axios.defaults.withCredentials=true;

但是設定後依舊不行

經過一天的百度與排查,我回滾到springboot 1.x 居然沒有這個問題,才定位到是升級到springboot 2.x導致的原因,好了,已經抓住兇手了,這下子好對症下藥了,去網路上看了springboot升級到2.x spring session 相關的問題。

終於發現了新大陸,spring-session 2.x 中 Cookie裡面居然引入了SameSite 這個叼毛,他預設值是 Lax,好了咱們來看看這個是什麼東西?

SameSite Cookie 是用來防止CSRF攻擊,它有兩個值:Strict、Lax

SameSite = Strict:

#意思是嚴格模式,顯示這個cookie在任何情況下都不可能作為第三方cookie;

SameSite = Lax:

意為寬鬆模式,在GET請求是可以作為第三方cookie,但是不能攜帶cookie進行跨域post訪問(這就很蛋疼了,我們那個校驗接口就是POST請求)

總結:前端請求到後台,每次session都不一樣,每次都是新的會話,導致獲取不到使用者資訊

解決方案:

#將SameSite設定為空白

@Configuration
public class SpringSessionConfig { 
    @Bean
    public CookieSerializer httpSessionIdResolver() {
        DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
        // 取消仅限同一站点设置
        cookieSerializer.setSameSite(null);
        return cookieSerializer;
    }
}

以上是SpringBoot2.x版本中使用SpringSession常見問題怎麼解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除