gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 27 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章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存储缓存数据需要进行如下配置

?
1
2
3
4
5
6
7
8
9
10
<!--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 >
?
1
2
3
4
5
6
#使用使用Redis缓存session数据
spring.session.store-type=REDIS
#Redis服务器地址
spring.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通过就可以了 。

后端 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@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);
     }
}

前端 。

?
1
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设置为空 。

?
1
2
3
4
5
6
7
8
9
10
@Configuration
public class SpringSessionConfig {
     @Bean
     public CookieSerializer httpSessionIdResolver() {
         DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
         // 取消仅限同一站点设置
         cookieSerializer.setSameSite( null );
         return cookieSerializer;
     }
}

问题解决!! 。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我.

原文链接:https://blog.csdn.net/xiaojun081004/article/details/83066462 。

最后此篇关于SpringBoot2.x版本中,使用SpringSession踩的坑及解决的文章就讲到这里了,如果你想了解更多关于SpringBoot2.x版本中,使用SpringSession踩的坑及解决的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com