SpringBoot2.x版本中,使用SpringSession踩的坑及解决

网友投稿 296 2022-12-31

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存储缓存数据需要进行如下配置:

org.springframework.session

spring-session-core

org.springframework.session

spring-session-data-redis

#使用使用Redis缓存session数据

spring.session.store-type=REDIS

#Redis服务器地址

sprRjKztwming.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() {

Dehttp://faultCookieSerializer cookieSerializer = new DefaultCookieSerializer();

// 取消仅限同一站点设置

cookieSerializer.setSameSite(null);

return cookieSerializer;

}

}

问题解决!!

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:浙江宁波快递物流查询单号(浙联物流单号网上查询)
下一篇:网站api接口手机(提供api接口的平台)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~