引言
浏览器在发送跨域请求的时候会判断一下是简单请求还是非简单请求,简单请求:先执行后判断是否跨域。如果是非简单请求,会先发一个命令,检查通过之后才会真正把跨域请求发出去。
定义
简单请求:
方法为:post/get/head
绝对不是put和delete,put是传文件,delete是删文件肯定不安全,不可能不发option
Request header里面(注意是请求头,不是响应头)
- 无自定义头!!!!!
- Content-Type为以下几种:
– text/plain
–multipart/form-data
–application/x-www-form-urlencoded
【举例】
举例一个post请求,要看其请求头的content-type,也看其有没有自定义头
这条请求的请求头里的content-type为text/plain且无自定义头所以是简单请求。
get虽然没有content-type但也可能是非简单请求,如带了自定义头,比如下面这个get请求
对应代码:
再举一个带自定义头的get请求,带了token,非简单请求
非简单请求
工作中常见的有:
- put,delete方法的ajax请求
- 发送json格式的ajax请求(最常见,如下post例子)
- 带自定义头的ajax请求(如上get例子)
【举例】
这条请求的请求头content-type为application/json,非简单请求。看请求头里有origin所以是跨域请求。刚才引言中说,如果是非简单请求,会先发一个命令,检查通过之后才会真正把跨域请求发出去。 所以看该请求上面还有个view请求,打开
类型为option,这就是预检命令。
预检命令
预检命令包含下面三个字段
access-control-request-headers
access-control-request-method
origin
预检命令是浏览器自动发出
例2:
预检命令的缓存
非简单请求每次会发出两条请求,自然会影响我们的效率,HTTP协议里面增加了一个响应头可以用来缓存我们的预检命令。
该响应头字段时access-control-max-age,即告诉浏览器在一个小时之内可以缓存这段信息,不需要再发送预检命令(后台处理)