SpringBoot2.x版本中,使用SpringSession踩的坑及解決
SpringBoot2.x SpringSession踩坑
Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘org.springframework.boot.autoconfigure.session.SessionAutoConfiguration$ServletSessionRepositoryValidator': Invocation of init method failed; nested exception is org.springframework.boot.autoconfigure.session.SessionRepositoryUnavailableException: No session repository could be auto-configured, check your configuration (session store type is ‘redis')
這是因為缺少了spring-session-data-redis依賴。
關(guān)于SpringBoot2.X中,引用SpringSession,同時使用Redis存儲緩存數(shù)據(jù)需要進行如下配置:
<!--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數(shù)據(jù) spring.session.store-type=REDIS #Redis服務(wù)器地址 spring.redis.host=127.0.0.1 #Redis服務(wù)器端口號 spring.redis.port=6379
總結(jié):
在SpringBoot2.x的版本中,引用spring-session-core時,不是對spring-session-data-redis進行加載,需要用戶自己添加關(guān)于spring-session與redis的關(guān)聯(lián)依賴。
springboot 2.x 踩坑——跨域?qū)е聅ession問題
目前IT界主流前后端分離,但是在分離過程中一定會存在跨域的問題。
什么是跨域?
是指瀏覽器從一個域名的網(wǎng)頁去請求另一個域名的資源時,域名、端口、協(xié)議任一不同,都是跨域。
遇到的場景
當(dāng)我們用springboot + shrio +vue 來做后臺管理的項目時,無法獲取shiroSession當(dāng)前登錄的用戶,
于是我們就排查,網(wǎng)上說在跨域時讓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(); // 對接口配置跨域設(shè)置 source.registerCorsConfiguration("/**", buildConfig()); return new CorsFilter(source); } }
前端
axios.defaults.withCredentials=true;
但是設(shè)置后依舊不行
經(jīng)過一天的百度與排查,我回滾到springboot 1.x 居然沒有這個問題,才定位到是升級到springboot 2.x導(dǎo)致的原因,好了,已經(jīng)抓住兇手了,這下子好對癥下藥了,去網(wǎng)上看了 springboot升級到2.x spring session 相關(guān)的問題。
終于發(fā)現(xiàn)了新大陸,spring-session 2.x 中 Cookie里面居然引入了SameSite 這個叼毛,他默認值是 Lax,好了咱們來看看這個是什么東西?
SameSite Cookie 是用來防止CSRF攻擊,它有兩個值:Strict、Lax
SameSite = Strict:
意為嚴格模式,表明這個cookie在任何情況下都不可能作為第三方cookie;
SameSite = Lax:
意為寬松模式,在GET請求是可以作為第三方cookie,但是不能攜帶cookie進行跨域post訪問(這就很蛋疼了,我們那個校驗接口就是POST請求)
總結(jié):前端請求到后臺,每次session都不一樣,每次都是新的會話,導(dǎo)致獲取不到用戶信息
解決方案:
將SameSite設(shè)置為空
@Configuration public class SpringSessionConfig { @Bean public CookieSerializer httpSessionIdResolver() { DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer(); // 取消僅限同一站點設(shè)置 cookieSerializer.setSameSite(null); return cookieSerializer; } }
問題解決?。?
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java構(gòu)造器(構(gòu)造方法)能否可以被重寫
這篇文章主要介紹了Java構(gòu)造器(構(gòu)造方法)能否可以被重寫問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03Java中replace、replaceAll和replaceFirst函數(shù)的用法小結(jié)
相信會java的同學(xué)估計都用過replace、replaceAll、replaceFirst這三個函數(shù),可是,我們真的懂他們嗎?下面通過這篇文章大家再來好好學(xué)習(xí)學(xué)習(xí)下這幾個函數(shù)。2016-09-09Struts2單選按鈕詳解及枚舉類型的轉(zhuǎn)換代碼示例
這篇文章主要介紹了Struts2單選按鈕詳解及枚舉類型的轉(zhuǎn)換代碼示例,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-02-02SpringBoot生成License的實現(xiàn)示例
License指的是版權(quán)許可證,那么對于SpringBoot項目,如何增加License呢?本文就來介紹一下,感興趣的可以了解一下2021-06-06springboot集成junit編寫單元測試實戰(zhàn)
在做單元測試時,代碼覆蓋率常常被拿來作為衡量測試好壞的指標(biāo),本文主要介紹了springboot集成junit編寫單元測試實戰(zhàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02Java Adapter 適配器模式(類適配器,對象適配器)優(yōu)缺點對比
這篇文章主要介紹了Java 適配器模式(類適配器,對象適配器)優(yōu)缺點對比的相關(guān)資料,java 適配器在基礎(chǔ)知識中還是比較重要的,這里就說下如何使用,需要的朋友可以參考下2016-12-12