跨域问题
背景
跨域问题导致了浏览器无法拿到服务器的响应结果,把它拦截了下来,请求实际上是到达了服务器的,跨域是在浏览器同源策略
的校验不通过产生的。
具体过程
对于浏览器来说,对于不同的请求内容,它会有不同的处理方式。
简单请求
概念
- 请求方法为
GET
POST
HEAD
- 头部字段符合CORS安全规范
- 请求体内容为
- text/plain
- multiple/form-data
- multiple/x-www-form-urlencoded
请求流程
- 浏览器发送请求到服务器。
- 服务器处理请求并返回响应。
- 浏览器检查
Access-Control-Allow-Origin
,决定是否拦截响应。
复杂请求
概念
不是简单请求的都是复杂请求,复杂请求在实际请求发送之前会发送一个预检请求(preflight)
Options方法。
请求过程
- 浏览器发送预检请求(OPTIONS)到服务器。
- 服务器返回预检响应。
- 预检响应里面会有服务器允许的请求体和请求体格式、以及这个预检校验生效时间(
Access-Control-Max-Age
),在这个时间以内,浏览器不用发送预检请求询问了,直接允许跨域。
- 预检响应里面会有服务器允许的请求体和请求体格式、以及这个预检校验生效时间(
- 浏览器检查预检响应,决定是否发送实际请求。
- 如果预检通过,浏览器发送实际请求,服务器处理并返回响应。
- 浏览器检查
Access-Control-Allow-Origin
,决定是否拦截响应。
在预检请求中,会携带实际请求用到的请求方法和请求头