前言
最近做需求时发现了一个跨域问题,服务是我们自己的,那么解决跨域的首选当然就是cors了,然后就让服务端在响应头给加上Access-Control-Allow-Origin,加完之后发现还是跨域,这是怎么回事呢?cors处理正常就是服务端加上响应头就好了,为什么还是跨域?带着问题查了一些资料,这里做一下总结。
什么是跨域
发起网络请求的站点和请求的url的协议,域名,端口号任意一个不一样就是跨域。
跨域请求做了哪些事情
简单请求
全部满足以下条件的时即为简单请求
- 请求方法为:
- GET
- POST
- HEAD
- Content-Type:
- text/plain
- multipart/form-data
- application/x-www-form-urlencoded
- 请求头字段满足cors规范fetch.spec.whatwg.org/#cors-safel…
预检请求
只要简单请求中的某一个条件不满足就会触发预检请求。 详细见
预检请求时请求类型为 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类型,服务端是否支持。主要是跨域请求没有通过,浏览器都会报跨域错误,这个时候也可以使用抓包工具看下,发送的请求类型以及服务端真正的响应数据。