http请求跨域处理 - cors

243 阅读2分钟

前言

最近做需求时发现了一个跨域问题,服务是我们自己的,那么解决跨域的首选当然就是cors了,然后就让服务端在响应头给加上Access-Control-Allow-Origin,加完之后发现还是跨域,这是怎么回事呢?cors处理正常就是服务端加上响应头就好了,为什么还是跨域?带着问题查了一些资料,这里做一下总结。

什么是跨域

发起网络请求的站点和请求的url的协议,域名,端口号任意一个不一样就是跨域。

跨域请求做了哪些事情

简单请求

全部满足以下条件的时即为简单请求

  1. 请求方法为:
    • GET
    • POST
    • HEAD
  2. Content-Type:
    • text/plain
    • multipart/form-data
    • application/x-www-form-urlencoded
  3. 请求头字段满足cors规范fetch.spec.whatwg.org/#cors-safel…

image.png

预检请求

只要简单请求中的某一个条件不满足就会触发预检请求。 详细见

预检请求时请求类型为 OPTION ,请求头携带

OPTIONS /resource/foo
Access-Control-Request-Method: POST
Access-Control-Request-Headers: origin, x-requested-with
Origin: https://foo.bar.org

如果服务器允许则会返回

HTTP/1.1 200 OK
Content-Length: 0
Connection: keep-alive
Access-Control-Allow-Origin: https://foo.bar.org
Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE
Access-Control-Max-Age: 86400

Access-Control-Max-Age 时间是服务器告诉浏览器,这个来源的请求都可以放行,这段时间内就不需要再发送预检请求。

总结

跨域请求时,服务端如果配置了Access-Control-Allow-Origin但是仍然报错跨域,那么就要考虑是不是预检请求没有通过,预检请求是OPTION类型,服务端是否支持。主要是跨域请求没有通过,浏览器都会报跨域错误,这个时候也可以使用抓包工具看下,发送的请求类型以及服务端真正的响应数据。