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