跨域资源共享(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



