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依赖。
关于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服务器地址
#Redis服务器端⼝号
总结:
在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();
// 对接⼝配置跨域设置
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请求)
spring framework版本总结:前端请求到后台,每次session都不⼀样,每次都是新的会话,导致获取不到⽤户信息
解决⽅案:
将SameSite设置为空
@Configuration
public class SpringSessionConfig {
@Bean
public CookieSerializer httpSessionIdResolver() {
DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
// 取消仅限同⼀站点设置
cookieSerializer.setSameSite(null);
return cookieSerializer;
}
}
问题解决!!
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。