文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringBoot2.x版本中,使用SpringSession常见问题及解决方法

2023-06-20 12:57

关注

本篇内容主要讲解“SpringBoot2.x版本中,使用SpringSession常见问题及解决方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“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服务器地址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通过就可以了

后端

@Configurationpublic 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设置为空

@Configurationpublic class SpringSessionConfig {     @Bean    public CookieSerializer httpSessionIdResolver() {        DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();        // 取消仅限同一站点设置        cookieSerializer.setSameSite(null);        return cookieSerializer;    }}

问题解决!!

到此,相信大家对“SpringBoot2.x版本中,使用SpringSession常见问题及解决方法”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯