实战系列-Spring Boot跨域解决方案
导语
在实际工作开发中经常会遇到跨域请求,这个时候就需要前后端来共同协调来解决问题,那么在Spring Boot中怎么解决跨域请求问题呢?下面就来看看
什么是跨域
为了保证浏览器的安全,不同源地址的客户端脚本在没有经过明确授权的情况下是不能读写彼此的资源的,这个就是叫做同源策略,同源策略是浏览器安全问题的基石。如果没有这种限制,那么浏览器可以毫无限制的去控制整个的网络体系。那么什么是跨域呢?
如果一个请求地址里面的协议、域名和端口号都相同,就属于同源。
例如,判断下面的URL是否和http://www.a.com/a/a.html同源:
- http://www.a.com/b/b.html 同源
- http://www.b.com/a/a.html 不同源,域名不同
- https://www.a.com/b/b.html 不同源,协议不同
- http://www.a.com:8080/b/b.html 不同源,端口号不同
根据同源策略,非同源脚本不可以操作其他源下面的对象,想要操作的话就需要进行跨域,在同源策略下,非同源的网站之间不能发送Ajax请求。如果有这样的需求,就需要进行跨域操作。
CORS 技术
为了解决上述问题,W3C提出了跨院资源共享方案,也就是CORS技术(Cross-Origin Resource Sharing)
CORS 可以在不破坏现有规则的情况下,通过后端服务器实现CORS接口,从而实现跨域通信。CORS请求分为两类:简单请求和非简单请求,分别对跨域通信提供了支持操作。
什么是简单请求
在CORS技术出现之前,在HTTP请求头中不能包含任何的自定义字段,而且HTTP请求信息也不能操作如下的一些
- Accept
- Accept_Language
- Content_Language
- Last-Event-ID
- Content-Type(application/x-www-form-urlencoded、multipart/form-data、text/plain)
根据对简单请求的的分析,CORS的策略是在请求时在请求头中增加一个Origin字段,服务器收到请求后,根据该字段判断是否允许该请求访问。
- 如果允许,就在HTTP请求头信息中添加Access-Control-Allow-Origin字段,并且返回正确的字段
- 如果不允许,就不加入该字段
处理Access-Control-Allow-Origin字段,还有其他的字段可以描述CORS返回结果
- Access-Control-Allow-Credentials:可选,用户是否可以发送、处理cookie。
- Access-Control-Expose-Headers: 可选,可以让用户拿到的字段,有即可字段无论设置与否都可以获取到,包括Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。
什么是非简单请求
对于非简单请求的跨源请求,浏览器会在真实请求发出前增加一次OPTION请求,称为预检请求。在预检请求将真实请求的信息,包括请求方法、自定义头字段、源信息添加到HTTP头信息字段中,询问服务器是否允许这样的操作。
例如在一个GET请求中,与CORS相关的字段有:
- 请求使用的HTTP方法 Access-Control-Request-Method
- 请求中包含的自定义头字段Access-Control-Request-Headers
服务器收到请求时,需要对Origin、Access-Control-Request-Method、Access-Control-Request-Headers 进行验证,验证通过后,会在返回HTTP头信息中添加如下的的内容
- Access-Control-Allow-Origin:
- Access-Control-Allow-Methods :真实请求允许的方法
- Access-Control-Allow-Headers :服务器允许使用的字段
- Access-Control-Allow-Credentials :是否允许用户发送、处理Cookie
- Access-Control-Max-Age :预检请求的有效期,单位为秒,有效期内,不会重复发送预检请求
CORS实现
CORS 的代码实现比较简单,主要要理解CORS实现跨域的原理和方式。具体配置如下。
@Configuration
public class CorsConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**") //允许跨域访问.allowedOrigins("*") // 允许跨域访问的源.allowedMethods("POST","GET","PUT","DELETE","OPTIONS") //允许请求的方式.maxAge(168000) // 预检间隔时间.allowCredentials(true); // 是否发送Cookie}
}
实战系列-Spring Boot跨域解决方案相关推荐
- Spring Boot跨域解决方案
一.什么是跨域 为保证浏览器的安全,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源,这称之为同源策略,如果一个请求地址里的协议.域名.端口号都相同,就属于同源.依据浏览器同源策略,非同源脚 ...
- spring boot 跨域请求_SpringBoot 系列教程 web 篇之自定义请求匹配条件 RequestCondition...
191222-SpringBoot 系列教程 web 篇之自定义请求匹配条件 RequestCondition 在 spring mvc 中,我们知道用户发起的请求可以通过 url 匹配到我们通过@R ...
- spring boot跨域问题
跨域是指不同域名之间相互访问.跨域,指的是浏览器不能执行其他网站的脚本.它是浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制.也就是如果在A网站中,我们希望使用Ajax来获得B网站 ...
- webmvcconfigurer配置跨域_为什么加了 Spring Security 会导致 Spring Boot 跨域失效呢?...
点击上方 IT牧场 ,选择 置顶或者星标 技术干货每日送达 作者:欧阳我去 链接:https://segmentfault.com/a/1190000019485883 作为一个后端开发,我们经常遇到 ...
- 本地Vue前端请求本地Spring Boot跨域问题(CROS错误)
一.Vue前端 请求的url为 : GET /WebServer/home/get-user-info?id=1 二.Spring Boot后端 是一个Get请求的RestFul接口地址,且后端应用的 ...
- 【安全系列之跨域】跨域解决方案
一.为什么会出现跨域问题 出于浏览器的同源策略限制.同源策略是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS.CS ...
- 跨域解决方案(CORS)
跨域解决方案(CORS) 1. 什么是跨域? 跨域问题是出于浏览器的[同源策略]限制.同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略 ...
- Elasticsearch实战篇——Spring Boot整合ElasticSearch
2019独角兽企业重金招聘Python工程师标准>>> 当前Spring Boot很是流行,包括我自己,也是在用Spring Boot集成其他框架进行项目开发,所以这一节,我们一起来 ...
- kuayu react_React+Spring实现跨域问题的完美解决方法
最近小编在学习react,在学习过程中遇到React+Spring实现跨域问题,下面小编记录了整个问题过程,给大家做个参考. react 跨域访问后台,默认是有跨域问题,并且火弧和谷歌浏览器,对跨域问 ...
最新文章
- 我在谷歌实习时发现了一个模型 bug,于是有了这篇 ACL
- 多重循环 ——— 打印九九乘法表 || 经典的打印金字塔(打印整个金字塔 打印空心金字塔 打印空心菱形金字塔)
- nginx和php之间是怎样通信的呢(简答)
- 程序员的数学--排列组合(2)
- android中点击按钮弹出一个编辑框,本人是在Button的基础上加了Dialog,Dialog添加了一个编辑框,怎么将Button上的显示文字变成...
- 麒麟系统兼容安卓生态 弥补生态短板
- CSP-S/J2019认证相关内容
- 算法高级(33)-拓扑排序-maven依赖关系的确定
- 【Elasticsearch】 es GZIP造成JAVA Native Memory泄漏案例
- 笔记-Handheld multi-frame super-resolution之一
- (转)ORACLE之常用FAQ V1.08
- 华为鸿蒙深度研究(100页)
- 员工提出离职时,再挽留已经迟了
- SketchUp教程:BIG事务所的建筑竞赛分析图表现(附笔刷+处理稿)
- 超级外链工具-在线SEO超级外链群发工具免费
- 关于Ajax原理与使用方式,收藏这一篇文章就够了!!
- 铁路轨道设备概述1:铁路轨道基础设备
- Matlab的fprintf函数使用百分号问题
- Android 上唯一好用的图片标注 App:马克标注
- 在家远程访问公司内网办公系统
热门文章
- Spring Cloud Config 规范 1
- Eureka核心知识点
- Java中选择排序,冒泡排序,插入排序,快速排序
- 【再探backbone 02】集合-Collection
- 虚拟机网络模式与网络配置
- (三)SpringMVC实现
- RAC srvctl 命令报 libpthread.so.0 cannot open shared object file No such file or directory 解决方法...
- 浅谈JavaScript中的apply、call和bind
- 沃尔玛正测试货架扫描机器人,并称不会取代人类员工
- 智能城市技术能够更好地改善日常生活