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通过就可以了

后端

@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() {
        DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
        // 取消仅限同一站点设置
        cookieSerializer.setSameSite(null);
        return cookieSerializer;
    }
}

问题解决!!

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

(0)

相关推荐

  • Springboot2 session设置超时时间无效的解决

    问题: 今天项目中遇到了一个设置时间超时的问题,按SpringBoot2的application.properties更改一直不生效. 解决方案: server.*属性用于控制Spring Boot使用的嵌入式容器 . Spring Boot将使用ServletWebServerFactory实例之一创建servlet容器的实例. 这些类使用server.*属性来配置受控的servlet容器(tomcat,jetty等). 当应用程序作为war文件部署到Tomcat实例时, server.*属性

  • SpringBoot2.x 整合Spring-Session实现Session共享功能

    1.前言 发展至今,已经很少还存在单服务的应用架构,不说都使用分布式架构部署, 至少也是多点高可用服务.在多个服务器的情况下,Seession共享就是必须面对的问题了. 解决Session共享问题,大多数人的思路都是比较清晰的, 将需要共享的数据存在某个公共的服务中,如缓存.很多人都采用的Redis,手动将Session存在Redis,需要使用时,再从Redsi中读取数据.毫无疑问,这种方案是可行的,只是在手动操作的工作量确实不少. LZ在这里采用的Spring-Session来实现.它使用代理

  • 详解SpringBoot2 使用Spring Session集群

    有几种办法: 1.扩展指定server 利用Servlet容器提供的插件功能,自定义HttpSession的创建和管理策略,并通过配置的方式替换掉默认的策略.缺点:耦合Tomcat/Jetty等Servlet容器,不能随意更换容器. 2.利用Filter 利用HttpServletRequestWrapper,实现自己的 getSession()方法,接管创建和管理Session数据的工作.spring-session就是通过这样的思路实现的. 3 利用spring session Spring

  • 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.Ses

  • Golang时间处理中容易踩的坑分析解决

    目录 简介 类型 时区 小心有坑 时间解析的使用场景 时间操作 获取当前时间 时区设置 时间格式化(时间类型转字符串) 时间类型转时间戳 时间戳转时间类型 时间字符串转时间类型 时间计算 获取时间类型具体内容 时间加减 时间间隔(耗时) 时间取整(向上取整向下取整) 拓展 json时间转换 简介 在各个语言之中都有时间类型的处理,因为这个地球是圆的(我仿佛在讲废话),有多个时区,每个时区的时间不一样,在程序中有必要存在一种方式,或者说一种类型存储时间,还可以通过一系列的方法转换成不同国家的时间.

  • springboot2.x引入feign踩的坑及解决

    目录 springboot2.x引入feign踩的坑 一.需求 二.什么是feign 三.springboot1.x中feign的使用 四.springboot2.x中feign的使用 feign调用方式比较 一.事发原因 二.方式1介绍 三.方式2介绍 四.调用结果测试 五.两种方式对比 六.小结一下 springboot2.x引入feign踩的坑 一.需求 最近公司项目需求,需要调用第三方服务的接口,所以选用了feign来实现(这里只说springboot2.x的pom引用,没有怎么使用,网

  • react路由v6版本NavLink的两个小坑及解决

    目录 react路由v6版本NavLink的两个小坑 react 路由React Router(v6) 安装react-router 一级路由 重定向 NavLink高亮 useRoutes路由表----嵌套路由 路由的params参数 路由的search参数 路由的state参数 编程式路由导航 react路由v6版本NavLink的两个小坑 本人新人,是按照文档进行学习的,今遇到两个小坑,现记录如下: 第一点,当前版本的NavLink的style或者className当中的isActive,

  • springboot2.6.4集成swagger3.0遇到的坑及解决方法

    Swagger简介 号称:世界上最流行的API框架 PestFul API文档在线自动生成器 --> API文档与API定义同步更新可以直接运行,测试API接口 支持多种语言 强调:我的springboot版本2.6.4,swagger为3.0,其他版本可能修改不成功,大家可以试试. 在集成的时候出现了很多问题 坑一:首先先排除问题 ,我使用的springboot版本2.6.4,导入的swagger依赖如下 <dependency> <groupId>io.springfox

  • MyBatis中使用foreach循环的坑及解决

    目录 使用foreach循环的坑 正确写法为 忽现的Mybatis foreach失效记录 解决方案 使用foreach循环的坑 我们首先看一段MyBatis中使用foreach循环的sql: SELECT * FROM table where id in <foreach item="item" collection="ids1" open="(" close=")" index="0" separ

  • vue-cli项目中遇到的eslint的坑及解决

    目录 vue-cli遇到的eslint的坑 报错 关于eslint规则说明 vue-cli遇到的eslint的坑 报错 Do not access Object.prototype method 'hasOwnProperty' from target object no-prototype-builtins 原因:大概的意思是不要使用对象原型上的方法,因为原型上的方法可能被重写了. // bad if (obj.hasOwnProperty('name')) { } // good if (O

  • mybatis中 if-test 数字判断的坑及解决

    目录 if-test数字判断的坑 mybatis的test判断注意事项 if-test数字判断的坑 在项目中偶然发现一个判断数字的if没有起任何作用,代码如下 <if test="timeType !=null and timeType!='' and timeType == '3'">     AND     ... </if> 经过查询资料发现,mybatis是用OGNL表达式来解析的,在OGNL的表达式中,数字’3’会被解析成字符,java是强类型的,ch

  • 如何解决SpringBoot2.x版本对Velocity模板不支持的方案

    背景 在springboot1.4.x版本之前对velocity的模板支持的是相当好的,不止出于什么原因springboot从1.5.x以后停止了对velocity的支持,甚至在2.x版本中移除了和velocity的相关代码.目前手上有些项目使用的是velocity模板引擎,同时也使用了springboot,现在想升级到springboot2.x,同时还想继续使用velocity,怎么办?springboot不支持,就自己想办法支持下吧. 思路:把springboot早期版本的velocity支

  • 解决spring-boot2.0.6中webflux无法获得请求IP的问题

    这几天在用 spring-boot 2 的 webflux 重构一个工程,写到了一个需要获得客户端请求 IP 的地方,发现写不下去了,在如下的 Handler(webflux 中 Handler 相当于 mvc 中的 Controller)中 import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; im

随机推荐