关于 CORS 的介绍,主要参考文章 《Cross-Origin Resource Sharing (CORS)》
CORS 的工作原理是添加新的 HTTP headers 来让服务器描述哪些源的请求可以访问该资源,对于可能对服务器造成不好影响的请求,规范规定浏览器需要先发送“预检”请求(也就是 OPTION 请求),在预检请求通过后再发送实际的请求,服务器还可以通知客户端是否应该随请求发送“凭据”(例如 Cookie 和 HTTP 身份验证),更详细的介绍可以参考上面的文章,本文主要讨论 Spring Mvc 对 CORS 的支持。
需要注意的是:
不需要发送”预检“请求
可以看见 @CrossOrigin 注解可以标注在类或者方法上,其中几个常量如 DEFAULT_ORIGINS 已经在Spring 5.0弃用,取而代之的是 CorsConfiguration#applyPermitDefaultValues 方法。
标注在类上,该类的所有方法均会生效
同时也可以类和方法结合使用
@CrossOrigin 注解比较适用于较细粒度的跨域控制,对于全局的跨域控制, Spring Mvc 提供了 Global Configuration 配置。
Spring Mvc 对于全局的 CORS 比较简单,分为两个方案
创建 WebConfig 类实现 WebMvcConfigurer 接口,通过 CorsRegistry 设置跨域信息
通过 CorsConfiguration 设置跨域信息,并将 CorsConfiguration 通过 CorsFilter 构造函数传递进去
Spring Mvc 对于 CORS 可以说是非常方便,本文主要是想让各位开发者对跨域有个整体的了解,各个参数代表的含义,而不是在所有项目中都一概而论的设置为“*”,要在自身项目的实际需求以及安全性上多做思考,防止生产事故。
1、首先用蓝牙将手薄与C8RTK相连,将H6手簿背部(NFC读取模块在手簿背面)贴近南方RTK主机。2、其次设置CORS网络模式打开工程之星测量软件。
3、最后将“数据链”设置为“接收机移动网络”即可。
1.构成跨域的条件(满足下方任意一个条件则构成跨域)
domain不同(域名或者ip不同)
端口不同
协议不同(http/https)
给大家展示一个请求头和响应头,这是满足跨域的
请求头
```
POST http://127.0.0.1:10030/user/login HTTP/1.1
Host: 127.0.0.1:10030
Connection: keep-alive
Content-Length: 33
Pragma: no-cache
Cache-Control: no-cache
Accept: application/json, text/plain, */*
Origin: http://localhost:8080
User-Agent: Mozilla/5.0 (iPhoneCPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1
Content-Type: application/x-www-form-urlencoded
Referer: http://localhost:8080/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zhq=0.9,en-USq=0.8,enq=0.7
Cookie: cna=CKV9Ew45tVYCAX1SFKx2d19k_uab_collina=152896489958250435552525_umdata=65F7F3A2F63DF020E1473F196945E27DBC990F7BBC00081CD2D29B2B4AD9F1FCC05972083687D762CD43AD3E795C914CD2FEBFBF6205958F64E60BC7B372D87FHm_lvt_31d8fd22bdec2e7ab9e5855741f0fac1=1541048271,1541503268,1542598403,1543222019SESSION=NDllODZlMWQtODk5ZC00MDg3LThiN2ItNGM0MTRlMjZlOTFm
phone=15555555555&password=111111
```
响应头
```
HTTP/1.1 200
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Access-Control-Allow-Origin: http://localhost:8080
Access-Control-Allow-Credentials: true
Set-Cookie: rememberMe=deleteMePath=/Max-Age=0Expires=Tue, 01-Jan-2019 06:44:30 GMT
Content-Type: application/jsoncharset=UTF-8
Transfer-Encoding: chunked
Date: Wed, 02 Jan 2019 06:44:30 GMT
103
{"data":{"id":2,"name":null,"nickName":"15555555555","email":null}
0
```
详解
首先请求头中需要设置,这个是设置跨域的的协议,domain 和端口,也就是浏览器地址的栏的根路径
```
Origin: http://localhost:8080
```
服务器获取到这个请求头之后开始进行校验校验成功后,设置响应头
Access-Control-Allow-Origin 参数建议不要设置为 * 设置为 * 的话,其他的请求时则不会带上 Cookie
```
Access-Control-Allow-Origin: http://localhost:8080
Access-Control-Allow-Credentials: true
```
将这个响应头设置好返回给浏览器,就达到跨域的效果了
其他和跨域有关的响应头
```
//预检结果缓存时间,也就是上面说到的缓存啦
'Access-Control-Max-Age: 1800'
//允许的请求类型
'Access-Control-Allow-Methods:GET,POST,PUT,POST'
//允许的请求头字段
'Access-Control-Allow-Headers:x-requested-with,content-type'
```
参考链接 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)