1.简单请求:
GET POST HEAD
HEAD 返回的仅仅是头部(可以用于指导某个url返回的数据类型)
Origin: 表示请求是来自哪一台主机.
2.预请求: OPTION
给一个带有 withCredentials的请求发送响应的时候,服务器端必须指定允许请求的域名,不能使用'*'.
如果响应头是这样的:
HEAD 返回的仅仅是头部(可以用于指导某个url返回的数据类型)
Origin: 表示请求是来自哪一台主机.
Access-Control-Allow-Origin: * | www.baidu.com
表示允许哪一台主机进行跨域请求.*时所有主机均可以跨站请求.
2.预请求: OPTION
“预请求”要求必须先发送一个 OPTION 请求给目的站点,来查明这个跨站请求对于目的站点是不是安全可接受的。这样做,
是因为跨站请求可能会对目的站点的数据造成破坏。 当请求具备以下条件,就会被当成预请求处理:
①.请求以 GET, HEAD 或者 POST 以外的方法发起请求。或者,使用 POST,
但请求数据为
application/x-www-form-urlencoded, multipart/form-data 或者 text/plain
以外的数据类型。
比如说,用 POST 发送数据类型为 application/xml 或者 text/xml 的 XML 数据的请求。
Accept-ContentType:application/json
此时请求数据为json,所以会发送一次预请求.
②.使用自定义请求头(比如添加诸如
X-PINGOTHER)
$.ajax(url:"http://google.com",type:"get",
beforeSend: function(XMLHttpRequest) {
XMLHttpRequest.setRequestHeader("X-PINGOTHER","pingpong");
}
)
此时会有两个请求头一起被发送
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-PINGOTHER
服务端应该允许该请求头:
X-PINGOTHER
Access-Control-Allow-Headers: X-PINGOTHER
3.跨站时发送
cookie信息:需要将一个标志位
withCredentials设置为true.
var ajax = new XMLHttpRequest();
ajax.open('POST',"http://google.com",true);
ajax.withCredentials = true;
ajax.send;
但是,如果服务器端的响应中,如果没有返回
Access-Control-Allow-Credentials: true
的响应头,那么浏览器将不会把响应结果传递给发出请求的脚本程序,以保证信息的安全。
响应头:
Access-Control-Allow-Credentials:true
特别注意:
给一个带有 withCredentials的请求发送响应的时候,服务器端必须指定允许请求的域名,不能使用'*'.
如果响应头是这样的:
Access-Control-Allow-Origin: *
,则响应会失败.
4.检测XHR是否支持CORS:
var xhr = new XMLHttpRequest();
if (“withCredentials” in xhr){
alert("支持 withCredentials cookie CORS")
}