自定义请求头引起预检请求

修正

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返回头

举个例子

下面是一个预检请求,因为我添加了两个自定义请求头:authorizationcustom

image.png

这是服务器给我们的返回头为:
请注意,因为返回头没有Access-Control-Allow-Headers 所以浏览器阻止了接下来的get请求

image.png

控制台:
image.png

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策略

正确的返回头:
这里填写的是被允许的自定义请求头


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。