## 特殊請求
不符合簡單請求的條件,會被瀏覽器判定為特殊請求,,例如請求方式為PUT。
> 預檢請求
特殊請求會在正式通信之前,增加一次HTTP查詢請求,稱為"預檢"請求(preflight)。
瀏覽器先詢問服務器,當前網頁所在的域名是否在服務器的許可名單之中,以及可以使用哪些HTTP動詞和頭信息字段。只有得到肯定答復,瀏覽器才會發出正式的`XMLHttpRequest`請求,否則就報錯。
一個“預檢”請求的樣板:
```
OPTIONS /cors HTTP/1.1 //預檢請求方式是OPTIONS
Origin: http://manage.leyou.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: X-Custom-Header
Host: api.leyou.com
Accept-Language: en-US
Connection: keep-alive
User-Agent: Mozilla/5.0...
```
與簡單請求相比,除了Origin以外,多了兩個頭:
* Access-Control-Request-Method:接下來會用到的請求方式,比如PUT
* Access-Control-Request-Headers:會額外用到的頭信息
> 預檢請求的響應
服務的收到預檢請求,如果許可跨域,會發出響應:
```
HTTP/1.1 200 OK
Date: Mon, 01 Dec 2008 01:15:39 GMT
Server: Apache/2.0.61 (Unix)
Access-Control-Allow-Origin: http://manage.leyou.com
Access-Control-Allow-Credentials: true //允許訪問cookie
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: X-Custom-Header
Access-Control-Max-Age: 1728000
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Content-Length: 0
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Content-Type: text/plain
```
除了`Access-Control-Allow-Origin`和`Access-Control-Allow-Credentials`以外,這里又額外多出3個頭:
* Access-Control-Allow-Methods:允許訪問的方式
* Access-Control-Allow-Headers:允許攜帶的頭
* Access-Control-Max-Age:本次許可的有效時長,單位是秒,**過期之前的ajax請求就無需再次進行預檢了**
如果瀏覽器得到上述響應,則認定為可以跨域,后續就跟簡單請求的處理是一樣的了。