跨域资源共享(CORS)
- 跨域资源共享(CORS) 使用额外的 HTTP 头来告诉浏览器,让运行在一个
origin
域上的Web应用被准许访问来自不同源服务器上的指定的资源- 主要是为了保护服务端资源
- 浏览器本地缓存也会受到跨域限制
- cookie、storage、indexDB等
- cookie、storage、indexDB等
- 跨域指不同的域名,协议或端口
- 例如http和https就是不同协议,从http协议的地址向同一域名下https协议的地址请求会产生跨域
- 例如http和https就是不同协议,从http协议的地址向同一域名下https协议的地址请求会产生跨域
- 整个CORS通信过程,都是浏览器自动完成,不需要用户参与
- 浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求
- 因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信
- 如果请求的Origin的值不在指定的许可范围,服务端返回一个正常的HTTP回应,但这个回应的头信息没有包含Access-Control-Allow-Origin字段
- 此时浏览器就知道跨域请求失败了
- 这种错误无法通过状态码识别,因为HTTP回应的状态码有可能是200
- 同源策略只是浏览器的一个安全策略,只适用于浏览器向服务器发送请求的时候
- 当服务器跟服务器发送请求的时候,自然就没有这么一层限制
- 当服务器跟服务器发送请求的时候,自然就没有这么一层限制
跨域通信过程
- 对那些可能对服务器数据产生副作用的非简单请求方法,浏览器必须首先使用 OPTIONS 方法发起一个预检请求
- 从而获知服务端是否允许该跨域请求,服务器确认允许之后,才发起实际的 HTTP 请求
- 简单请求:
- 请求方法为
HEAD
、GET
或者POST
中的一种 - HTTP的头信息不超过以下几种字段
Accept
、Accept-Language
、Content-Language
Content-Type
的值只限于application/x-www-form-urlencoded
、multipart/form-data
、text/plain
三个- 经常使用的
application/json
就不是简单请求
- 经常使用的
- 请求方法为
- 请求首部字段
Origin
表明该请求来源,即请求发起的域名- 对于预检请求的头信息,必须包括两个特殊字段
Access-Control-Request-Method
- 列出浏览器的CORS请求会用到哪些HTTP方法
Access-Control-Request-Headers
- 一个逗号分隔的字符串,指定浏览器CORS请求会额外发送的头信息字段
- 响应首部字段
Access-Control-Allow-Origin
- 表明该资源被允许访问的域名,只能是单个域名或者
*
- 逗号分隔多个域名是行不通
- 但可以先获取请求origin进行判断,判断成功后把origin写入该字段的方式规避限制
*
表明该资源可以被任意外域访问- 正确响应的值应当为
*
或者包含由 Origin 首部字段所指明的域名
- 表明该资源被允许访问的域名,只能是单个域名或者
Access-Control-Allow-Headers
- 表明服务器支持的所有头信息字段,不限于浏览器在"预检"中请求的字段
- 它也是一个逗号分隔的字符串,是必须的
Access-Control-Allow-Methods
-
- 表明服务器支持的所有跨域请求的方法, 同样不限于浏览器在"预检"中请求的字段
- 该字段必需,它的值是逗号分隔的一个字符串
-
Access-Control-Allow-Credentials
- 表明是否允许请求时携带Cookie
- 如果要发送Cookie,
Access-Control-Allow-Origin
就不能设为星号,必须指定明确的、与请求网页一致的域名- 主要是为了Cookie安全
Access-Control-Max-Age
- 该字段可选,用来指定本次预检请求的有效期
- 允许缓存该条回应,在此期间,不用发出另一条预检请求
参考
来源:CSDN
作者:_萤火
链接:https://blog.csdn.net/winter_wu_1998/article/details/104800915