修正
Access-Control-Allow-Headers
一定不要设置为*
在移动端会出现 预检请求不通过的状况,切记切记切记!!!
概念
什么是CORS?
跨域资源共享(CORS) 是一种机制,它使用额外的 HTTP 头来告诉浏览器 让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源服务器上的指定的资源。当一个资源从与该资源本身所在的服务器不同的域、协议或端口请求一个资源时,资源会发起一个跨域 HTTP 请求。
一、自定义请求头跨域
Access to XMLHttpRequest at 'http://192.168.0.130:8001/api/test/test' from origin 'http://192.168.0.130:8002' has been blocked by CORS policy: Request header field authorization is not allowed by Access-Control-Allow-Headers in preflight response.
预检请求
与简单请求不同,“需预检的请求”要求必须首先使用 OPTIONS 方法发起一个预检请求到服务器,以获知服务器是否允许该实际请求。"预检请求“的使用,可以避免跨域请求对服务器的用户数据产生未预期的影响。
当请求满足下述任一条件时,即应首先发送预检请求:
使用了下面任一 HTTP 方法:
- PUT
- DELETE
- CONNECT
- OPTIONS
- TRACE
- PATCH
人为设置了对 CORS 安全的首部字段集合之外的其他首部字段。该集合为: - Accept
- Accept-Language
- Content-Language
- Content-Type (需要注意额外的限制)
- ...
也就是说 当你自定义了请求头,浏览器就会先发送预检请求,期望得到想要的Access-Control-Allow-Headers
返回头
举个例子
下面是一个预检请求,因为我添加了两个自定义请求头:authorization
、custom
这是服务器给我们的返回头为:
请注意,因为返回头没有Access-Control-Allow-Headers
所以浏览器阻止了接下来的get请求
控制台:
Access to XMLHttpRequest at 'http://192.168.0.130:8001/api/test/test' from origin 'http://localhost:8002' has been blocked by CORS policy: Request header field authorization is not allowed by Access-Control-Allow-Headers in preflight response.
什么意思呢?意思就是说请求头是不被授权的,已被CORS策略阻止
CORS策略
正确的返回头:
这里填写的是被允许的自定义请求头