目前IT界主流前后端分离,但是在分离过程中一定会存在跨域的问题。

什么是跨域?

  是指浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域。

  做过web后台的童鞋都知道,跨域这种问题是比较常见的,最近我们公司需要将springboot 1.x升级到2.x,在升级之后遇到了挺多的问题,例如某些类过时了或者某些类找不到等,还有就是今天要说得session不一致的情况(eg:请求不同接口,sessionID都不一致,即session不会共享)。

场景:

  今天前端童鞋跟我说,本地环境调用校验验证码接口一直报“未获取到用户信息,请重新登录”,我直接看了下这个接口,他是从session中获取的用户信息,如果用户不存在则会抛这种提示语。

  1.      HttpSession session = request.getSession(false);
  2. Object sessionObj = session.getAttribute(LOGIN_NAME);//session为空
  3. String currentName = null == sessionObj ? null : sessionObj.toString();
  4. if (StringUtils.isBlank(currentName)) {
  5. res.setMessage(messageUtil.getMessage("reLogin"));
  6. res.setStatusCode(StatusCode.RE_LOGIN.getCode());
  7. return res;
  8. }

  因为我们登录和校验验证码是两个接口,所以用户信息是从登录放进去的,然后在验证码接口中获取用户信息做后面的进一步操作。

看到这个之后,我看了下springboot的配置,都有配置session 共享的配置,而且我的session是放在redis里面的,有点郁闷,然后我就登录到测试环境登录一下试试看,咦~~居然可以,最后才反应过来是跨域的问题,然后我又去看了下代码,是有配置跨域的问题,真奇怪!

  经过一天的百度与排查,我回滚到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. @Configuration
  2. public class SpringSessionConfig {
  3.  
  4. public SpringSessionConfig() {
  5. }
  6.  
  7. @Bean
  8. public CookieSerializer httpSessionIdResolver() {
  9. DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
  10. // 取消仅限同一站点设置
  11. cookieSerializer.setSameSite(null);
  12. return cookieSerializer;
  13. }
  14. }

参考文章:

1、https://blog.csdn.net/qq_37060233/article/details/86595102

2、https://blog.csdn.net/boom_man/article/details/84642040

3、https://segmentfault.com/a/1190000017824101

4、https://segmentfault.com/a/1190000017175342?utm_source=tag-newest

升级springboot 2.x 踩过的坑——跨域导致session问题的更多相关文章

  1. vue+springboot前后端分离实现单点登录跨域问题处理

    最近在做一个后台管理系统,前端是用时下火热的vue.js,后台是基于springboot的.因为后台系统没有登录功能,但是公司要求统一登录,登录认证统一使用.net项目组的认证系统.那就意味着做单点登 ...

  2. SpringBoot入门教程(十三)CORS方式实现跨域

    什么是跨域?浏览器从一个域名的网页去请求另一个域名的资源时,域名.端口.协议任一不同,都是跨域 . 跨域资源访问是经常会遇到的场景,当一个资源从与该资源本身所在的服务器不同的域或端口请求一个资源时,资 ...

  3. Springboot实现filter拦截token验证和跨域

    背景 web验证授权合法的一般分为下面几种 使用session作为验证合法用户访问的验证方式 使用自己实现的token 使用OCA标准 在使用API接口授权验证时,token是自定义的方式实现起来不需 ...

  4. SpringBoot学习笔记(7)-----CORS支持解决跨域问题

    在实际应用开发中,跨域是一个比较常见的问题,解决方法可以用jsonp,frame,cors等, 这里示例的是SpringBoot对CORS的支持的三种实现方式 第一种:配置一种全局的支持,这种方式需要 ...

  5. Springboot 项目源码 vue.js html 跨域 前后分离 shiro权限

    官网:www.fhadmin.org 特别注意: Springboot 工作流  前后分离 + 跨域 版本 (权限控制到菜单和按钮) 后台框架:springboot2.1.2+ activiti6.0 ...

  6. springboot WebMvcConfigurer配置静态资源和解决跨域

    前言 虽然现在都流行前后端分离部署,但有时候还是需要把前端文件跟后端文件一起打包发布,这就涉及到了springboot的静态资源访问的问题.不单只是静态资源打包,比如使用本地某个目录作为文件存储,也可 ...

  7. 不用调整Nginx,SpringBoot也能解决前端访问的跨域问题

    1.什么情况下会出现跨域问题 通常,在前端工程师的开发过程中,往往在本地机器启动前端服务, 而调用的后端接口服务是在另外一台机器运行,这时就会出现跨域问题,让接口无法调通. 而到了测试环境和生产环境, ...

  8. Android Studio 升级为3.1 踩到的坑

    原文:https://blog.csdn.net/xiariluoxue/article/details/80050700 AndroidStudio.gradle.buildToolsVersion ...

  9. Spring-boot集成RabbitMQ踩过的坑

    1.java.net.SocketException: socket closed 官方文档已经说明,新建user和guest的账户是没有远程登录的权限的 需要对登录所用账户授权 解决方法: rabb ...

随机推荐

  1. 【转】学习apicloud和IOS之间的模块化使用

    最近公司有使用APICloud发开的需求,需要我这边提供一些模块包得封装.因为没有也是刚接触APICloud,所以也就在看官方文档 .下面讲一讲我再使用过程中得一点点东西. 首先,下载官方SDK,下载 ...

  2. Oracle Real Application Clusters (RAC)

    Oracle Real Application Clusters — 概述 包含 Oracle Real Application Clusters (RAC) 选件的 Oracle 数据库允许依托一组 ...

  3. alibaba druid监控页面的使用配置

    一.Maven中添加Durid连接池依赖 <!-- druid连接池 --> <dependency> <groupId>com.alibaba</group ...

  4. 学习jQuery的免费资源:电子书、视频、教程和博客

    jQuery毫无疑问是目前最流行的JavasScript库.排名最前的网站中70%使用了jQuery,并且jQuery也成为了Web开发的标准.如果你想找Web开发方面的工作,了解jQuery会大大的 ...

  5. Mysql常用运算符与函数汇总

    Mysql常用运算符与函数汇总 本文给大家汇总介绍了mysql中的常用的运算符以及常用函数的用法及示例,非常的全面,有需要的小伙伴可以参考下 我们先把数据表建好 use test;create tab ...

  6. Apache超时配置

    Apache超时配置 1. KeepAliveTimeout 语法 KeepAliveTimeout seconds 默认 5 上下文 server config, virtual host 说明 服 ...

  7. UIKeyboardType

    typedef NS_ENUM(NSInteger, UIKeyboardType) { UIKeyboardTypeDefault, // Default type for the current ...

  8. pycharm安装 suds模块报错:AttributeError: module 'pip' has no attribute 'main'

    需求:安装suds模块 遇到的问题: 一.报错信息:[file][Default Settint]---Project Interpreter 点击 搜索suds安装模块报错 解决:依据上图提示找到C ...

  9. CSS基础:block,inline和inline-block

    css的display属性是前端开发中非常常见的属性,本文简单介绍下其中比较常用的属性值,即block.inline和inline-block. HTML组件中呈现一片空白区域的组件都可当盒模型(bo ...

  10. COMP9021--6.13

    1. break语句和continue语句都可以在循环中使用,且常与选择结构结合使用,以达到在特定条件满足时跳出循环的作用.break语句被执行,可以使整个循环提前结束.而continue语句的作用是 ...