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