springboot 跨域配置cors
撸了今年阿里、头条和美团的面试,我有一个重要发现.......>>>
1 跨域的理解
跨域是指:浏览器A从服务器B获取的静态资源,包括Html、Css、Js,然后在Js中通过Ajax访问C服务器的静态资源或请求。即:浏览器A从B服务器拿的资源,资源中想访问服务器C的资源。
同源策略是指:浏览器A从服务器B获取的静态资源,包括Html、Css、Js,为了用户安全,浏览器加了限制,其中的Js通过Ajax只能访问B服务器的静态资源或请求。即:浏览器A从哪拿的资源,那资源中就只能访问哪。
同源是指:同一个请求协议(如:Http或Https)、同一个Ip、同一个端口,3个全部相同,即为同源。
2 跨域的处理
跨域的这种需求还是有的,因此,W3C组织制定了一个Cross-Origin Resource Sharing规范,简写为Cors
,现在这个规范已经被大多数浏览器支持,从而,处理跨域的需求。
Cors需要在后端应用进行配置,因此,是一种跨域的后端处理方式,这么做也容易理解,一个你不认识的源来访问你的应用,自然需要应用进行授权。除了后端处理方式,也有前端的解决方案,如:JSONP,因这里我们主要讲解SpringBoot2.x对Cors的配置,暂不对前端解决方案进行详细说明。
3 跨域的分类
跨域分为以下3种
名称 | 英文名 | 说明 |
---|---|---|
简单请求 | Simple Request |
发起的Http请求符合: 1.无自定义请求头, 2.请求动词为GET、HEAD或POST之一, 3.动词为POST时,Content-Type是application/x-www-form-urlencoded, multipart/form-data或text/plain之一 |
预检请求 | Preflighted Request |
发起的Http请求符合其中之一: 1.包含了自定义请求头, 2.请求动词不是GET、HEAD或POST, 3.动词是POST时, Content-Type不是application/x-www-form-urlencoded, multipart/form-data或text/plain。 即:简单请求的相反 |
凭证请求 | Requests with Credential | 发起的Http请求中带有凭证 |
4 SpringBoot2.x配置Cors
@RestController
@RequestMapping(value = "/api/users")
@CrossOrigin
public class UsersController{@Autowiredprivate UsersService usersService;@PostMapping@CrossOriginpublic User create(@RequestBody User user) {return userService.save(user);}
}
其中,@CrossOrigin注解可以使用以下参数
名称 | 类型 | 范围 | 必填 | 请求头字段 |
---|---|---|---|---|
value | String数组 | 类或方法 | 是 | Access-Control-Allow-Origin |
origins | String数组 | 类或方法 | 是,同value,可以二选一 | Access-Control-Allow-Origin |
methods | String数组 | 类或接口 | 是 | Access-Control-Allow-Methods |
maxAge | long | 类或接口 | 否 | Access-Control-Max-Age |
allowCredentials | String | 类或接口 | 否 | Access-Control-Allow-Credentials |
allowedHeaders | String数组 | 类或接口 | 否 | Access-Control-Request-Headers |
exposedHeaders | String数组 | 类或接口 | 否 | Access-Control-Expose-Headers |
- 备注说明
- value、origins属性:配置允许访问的源,如: http://anxminise.cc,
*
表示允许全部的域名 - methods属性:配置跨域请求支持的方式,如:GET、POST,且一次性返回全部支持的方式
- maxAge属性:配置预检请求的有效时间, 单位是秒,表示:在多长时间内,不需要发出第二次预检请求
- allowCredentials属性:配置是否允许发送Cookie,用于 凭证请求, 默认不发送cookie
- allowedHeaders属性:配置允许的自定义请求头,用于 预检请求
- exposedHeaders属性:配置响应的头信息, 在其中可以设置其他的头信息,不进行配置时, 默认可以获取到Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma字段
使用WebMvcConfigurer对象
@Configuration
public class MyConfiguration {@Beanpublic WebMvcConfigurer corsConfigurer() {return new WebMvcConfigurer() {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/api/**").allowedOrigins("*") .allowCredentials(true).allowedMethods("GET", "POST", "DELETE", "PUT","PATCH").maxAge(3600); }};}
}
或者这个方式:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addMapping("/**").allowedOrigins("*").allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE").maxAge(3600).allowCredentials(true);}
}
其中,通过相应的方法实现跨域请求的配置
方法类 | 方法名称 | 必填 | 请求头字段 | 说明 |
---|---|---|---|---|
CorsRegistry | addMapping | 是 |
无, 非Cors属性, 属于SpringBoot配置 |
配置支持跨域的路径 |
CorsRegistration | allowedOrigins | 是 | Access-Control-Allow-Origin | 配置允许的源 |
CorsRegistration | allowedMethods | 是 | Access-Control-Allow-Methods |
配置支持跨域请求的方法, 如:GET、POST,一次性返回 |
CorsRegistration | maxAge | 否 | Access-Control-Max-Age | 配置预检请求的有效时间 |
CorsRegistration | allowCredentials | 否 | Access-Control-Allow-Credentials | 配置是否允许发送Cookie, 用于 凭证请求 |
CorsRegistration | allowedHeaders | 否 | Access-Control-Request-Headers | 配置允许的自定义请求头, 用于 预检请求 |
CorsRegistration | exposedHeaders | 否 | Access-Control-Expose-Headers |
配置响应的头信息, 在其中可以设置其他的头信息 |
springboot 跨域配置cors相关推荐
- Nginx | Nginx之跨域配置(CORS)
Nginx之跨域配置 1. 注意 2. CORS 3. Nginx通过CROS 实现跨域 4. 配置信息 nginx.conf 中 1. 注意 服务端口不能与代理端口一致 端口会冲突 服务本身做了跨域 ...
- 【跨域】跨域原理 + springboot跨域配置(万能版)
先上配置 这个配置是个万能药,配上之后就没有任何跨域问题了. @Configuration public class MvcConfig implements WebMvcConfigurer {@B ...
- Springboot跨域配置报错:When allowCredentials is true, allowedOrigins cannot contain the specia
错误信息为: When allowCredentials is true, allowedOrigins cannot contain thespecial value "*"si ...
- Springboot 跨域配置
访问后端接口遇到错误提示: When allowCredentials is true, allowedOrigins cannot contain the special value "* ...
- Gateway网关-网关的cors跨域配置
什么是跨域问题 跨域:域名不一致就是跨域,主要包括: 域名不同: www.taobao.com 和 www.taobao.org 和 www.jd.com 和 miaosha.jd.com 域名相同, ...
- springboot解决跨域问题(Cors)
springboot解决跨域问题(Cors) 参考文章: (1)springboot解决跨域问题(Cors) (2)https://www.cnblogs.com/owenma/p/8466856.h ...
- springboot2.4跨域配置的方法
这篇文章主要介绍了springboot2.4跨域配置的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 1.如果只是一个简单的springbo ...
- springBoot跨域注解@CrossOrigin
Spring Framework 4.2 GA为CORS提供了第一类支持,使您比通常的基于过滤器的解决方案更容易和更强大地配置它.所以springMVC的版本要在4.2或以上版本才支持@CrossOr ...
- 记一次option请求与jwt过滤器冲突引起的跨域问题(CORS Missing Allow Origin)
前端:vue3 + axios + - (http://localhost:8080) 后端 :springboot + jwt +-(http://localhost) 因为端口不同,会发生跨域问题 ...
最新文章
- Shell合并两个文件成一个文件的两列paste,awk
- jquery中not方法失效的解决方案
- HttpClient 设置不当引发的一次雪崩!
- Linux解决openoffice转换PDF乱码问题(ubutun16.0.4)
- 【学习记录】macOS的Redis安装及基本使用
- 项目落地才是硬道理!TensorFlow 2 牛了
- spring security reactive获取security context
- 全球第一张中文网络协议分析图——By 成都科来软件
- PyTorch:tensor-数据处理
- tyvj p1016 装箱问题( 简单DP 01背包)
- 有无3C认证的电源价格差别说明什么?
- Java生成png文件字体不清晰_导出pdf图片字体模糊
- 网易邮箱大师使用排雷
- 三极管的下拉电阻作用是什么?
- 电脑断网的解决办法(方法不会对电脑或网络造成负面影响)
- 山东计算机考研909,山东大学2018年计算机考研909数据结构考试大纲
- 华为交换机5855设置ssh
- 批量提取网页中的超链接
- Qt CRC16校验中,有时候电脑计算的CRC值和单片机中计算的值不一样
- edgewin10无法安装_处理win10无法打开edge怎么解决
热门文章
- C#中Math的使用总结
- .NET实现之(自动更新)
- 解析PHP实现多进程并行执行脚本
- MySQL启动mycat分库分表报错Java HotSpotTM 64-Bit Server VM warning: ignoring option MaxPermSize=64M
- PHP的转义字符与\r\n
- python语言程序设计实践教程答案实验六_20192417 实验一《Python程序设计》实验报告...
- java虚拟机通俗_JAVA虚拟机的通俗解释
- 社会化图标html,[CSS]响应式社会化分享按钮
- vs需要迁移_这可能是目前最全面的无服务器迁移实践
- html页面加载转圈,纯CSS实现加载转圈样式