当前位置: 首页 > news >正文

解决SpringBoot中出现的跨域请求问题

When allowCredentials is true, allowedOrigins cannot contain the
special value "*"since that cannot be set on the
“Access-Control-Allow-Origin” response header. To allow credentials to
a set of origins, list them explicitly or consider using
“allowedOriginPatterns” instead.

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {@Resourceprivate LoginInterceptor loginInterceptor;@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOriginPatterns("*").allowCredentials(true).allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS").maxAge(3600);}@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.// 添加拦截器addInterceptor(loginInterceptor).// 添加拦截路径addPathPatterns("/**").// 白名单excludePathPatterns("/login");}
}123456789101112131415161718192021222324252627

登录拦截器

@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {@Resourceprivate RedisTemplate<Object, Object> redisTemplate;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {log.info("拦截器===>" + "LoginInterceptor.preHandle");// PreFlight请求,忽略本拦截器// 浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request)// 从而获知服务端是否允许该跨源请求// 服务器确认允许之后,才发起实际的 HTTP 请求// 如果是预检请求 没有做登录验证直接放行// 没有放心 在下面的操作中不能从请求头中取得tokenif (CorsUtils.isPreFlightRequest(request)) {return true;}//...登录验证的操作}
}123456789101112131415161718192021222324

在跨域请求中, 会有一次预检请求.

跨源资源共享 (CORS) (或通俗地译为跨域资源共享)是一种基于HTTP 头的机制,该机制通过允许服务器标示除了它自己以外的其它origin(域,协议和端口),这样浏览器可以访问加载这些资源。跨源资源共享还通过一种机制来检查服务器是否会允许要发送的真实请求,该机制通过浏览器发起一个到服务器托管的跨源资源的"预检"请求。在预检中,浏览器发送的头中标示有HTTP方法和真实请求中会用到的头。

如, 再一次登录的过程中,
首先会发送一次 OPTIONS 请求, 请求头如下:

OPTIONS /manager/login HTTP/1.1
Host: 192.168.161.31:8083
Connection: keep-alive
Accept: */*
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Origin: http://192.168.161.31:8080
Sec-Fetch-Mode: cors
Referer: http://192.168.161.31:8080/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
1234567891011

服务端支持CROS之后, 给出的部分响应头如下

Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: content-type
Access-Control-Allow-Methods: GET,HEAD,POST,PUT,DELETE,OPTIONS
Access-Control-Allow-Origin: http://192.168.161.31:8080
Access-Control-Max-Age: 3600
Allow: GET, HEAD, POST, PUT, DELETE, OPTIONS, PATCH
Connection: keep-alive
Content-Length: 0
Date: Thu, 14 Jan 2021 12:04:29 GMT
Keep-Alive: timeout=60
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
12345678910111213

注意响应头中有一个 Access-Control-Allow-Origin 字段, 用来记录可以访问该资源的域, 当浏览器收到这样的响应头信息之后, 就会提取该字段的值, 发现该字段的值包含当前页面所在的域, 就知道这次的跨域是可以被允许的, 因此就不在对前端的跨域请求进行限制.
在跨域的整个过程中, 不需要对前端的代码进行修改, 主要是后端进行处理.

欢迎批评指正
敬礼!

参考资源:
SpringBoot升级2.4.0所出现的问题:When allowCredentials is true, allowedOrigins cannot contain the specia
CORS详解
SpringBoot + Vue全栈开发实战

相关文章:

  • RainBond 构建组件 rbd-chaos 故障解决 【真实案例】
  • 单例模式的双重检查锁定是什么?
  • 如何使用ModuleShifting测试Module Stomping和Module Overloading注入技术
  • LeetCode75| 二叉搜索树
  • 新建虚拟环境并与Jupyter内核连接
  • 【Harmony OS - Stage应用模型】
  • Mybatis-Plus中怎么使用MySQL的内置函数
  • DevOps系列之 JNI实现Java调用C的实现案例
  • 负载均衡概述
  • 微服务(1)
  • ROS学习记录:使用RViz观测激光雷达传感器数据
  • Hive中支持毫秒级别的时间精度
  • 浅谈冯诺依曼体系和操作系统
  • SQL 解析 — 如何轻松实现新增语句
  • vite+Vue3学习笔记(3)——界面设计
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 0x05 Python数据分析,Anaconda八斩刀
  • AHK 中 = 和 == 等比较运算符的用法
  • Angular Elements 及其运作原理
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • es的写入过程
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • Java Agent 学习笔记
  • Javascript Math对象和Date对象常用方法详解
  • Java应用性能调优
  • Kibana配置logstash,报表一体化
  • Mithril.js 入门介绍
  • MQ框架的比较
  • React组件设计模式(一)
  • Shadow DOM 内部构造及如何构建独立组件
  • Vue.js源码(2):初探List Rendering
  • Vue实战(四)登录/注册页的实现
  • 经典排序算法及其 Java 实现
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 微信小程序开发问题汇总
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • kubernetes资源对象--ingress
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 如何在招聘中考核.NET架构师
  • ![CDATA[ ]] 是什么东东
  • #ifdef 的技巧用法
  • #window11设置系统变量#
  • (2015)JS ES6 必知的十个 特性
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (SpringBoot)第二章:Spring创建和使用
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (十八)三元表达式和列表解析
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转) Face-Resources
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (总结)Linux下的暴力密码在线破解工具Hydra详解