跨域资源共享
最大作用:跨域访问
CORS是什么
全称Cross-Origin Resource Sharing ,译为跨域资源共享,新增了一组http首部字段,允许服务器声明哪些源站有权限访问哪些资源
跨域资源共享机制的工作原理主要应用于三个场景:
-
简单请求
-
预检请求(得到服务器的认证)
-
认证请求
简单请求是什么
满足所有下述条件,则该请求可视为‘简单请求
-
使用下列方法之一:get,head或者post
-
不得人为设置下列集合之外的其他首部字段:Accept,Accept-Language,Content-Language,Content-Type
-
Content-Type的值仅限于下列三者之一:
请求消息
GET /resources/ public-data/ HTTP/1.1
Host: bar.other
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081130 Minefield/3.1b3pre
Accept: text/html,application/ xhtml+xml,application/xml;a=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip.deflate
Accept-Charset: IS0-8859 1,utf 8;q=0.7,*;q=0.7
Connection: keep-alive
Referer: htp://oo.example/examples/access control/simpleXSInvocation.html,
Origin: http://foo.example
请求首部字段Origin表示该请求来源于ttp://foo.exmalple, Origir 的值是每次发送请求时自动携带的请求首部消息。
响应消息
以下是响应消息示例:
HTTP/1.1 200 OK
Date: Mon, 01 Dec 2008 00:23:53 GMT
Server: Apache/2.0.61
Access-Control-Allow-Origin: *
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content Type: application/xml
[XML Data]
响应中携带了响应首部字段Access -Control- Allow - Origin,使用Origin和Access- Control’Allow-Origin完成最简单的访问控制。
本例中,服务端返回的Access -Control-Allow-Origin: *表明该资源可以被任意外域访问。
预检请求是什么
当请求满足下述任一条件时,即应首先发送预检请求:
- 使用下列请求方法之一: PUT、DEETE、CONNECT、OPTIONS、TRACE或PATH
- 不得人为设置下列集合之外的其他首部字段: Accept、 Accept-Language、Content-Language、Content-Type
- Content-Type的值仅限于下列三者之一 :
- text/plain
- multipart/form- data
- application/x-www-form-udlencoded
预检请求要求必须首先使用OPTIONS方法发起一个预检请求到服务器,以获知服务器是否允许该实际请求。
预检请求可以避免跨域请求对服务器的用户数据产生未预期的影响。
请求消息
以下是OPTIONS预检请求消息示例:
OPTIONS /resources/access-control-with-post-preflight/ HTTP/1.1
Host: aruner.net
User-Agent: Moilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081130 Minefield/3.1b3pre
Accept: text/htmlapplication/xhtml+xml,application/xml;q=0.9, */*;q=0.8
Accept-Language: en-us,en;g=0.5
Accept Encoding: gzip,deflateKeep-Alive: 300
Connection: keep-alive
Origin: http://arunranga.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-PINGARUNER
- 请求首部字段Access-Control-Request-Method表示该请求使用POST方法。
- 请求首部字段Access- Control- Request-Headers表示该请求携带X-PINGOTHER首部字段。
响应消息
以下是OPTIONS预检请求的响应消息示例:
HTTP/1.1 200 OK
Date: Mon, 01 Dec 2008 01:15:39 GMT
Access-Control-Allow-Origin: http://arunranga.com
Access-Control-Allow-Methods: POST GET, OPTIONS
Access-Control-Allow-Headers: X-PINGARUNER
Access-Control-Max- Age: 1728000
Content-Encoding: gzip
Content-Length: 0
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Content-Type: text/ plain
- 响应首部字段Access-Control-Allow-Methods表示允许POST、GET和OPTIONS请求方法。
- 响应首部字段Access-Control-Allow-Headers表示允许请求携带首部字段X-PINGOTHER。
- 响应首部字段Access-Control-Max- Age表示设置响应有效时间为1728000秒。
认证请求是什么
CORS具有一个有趣的特性是,可以基HTTP Cookies和HTTP认证信息发送身份凭证。一般而言,对于跨域XMLHttpRequest请求,浏览器不会发送身份凭证信息。如果要发送凭证信息,
需要设置XML .HttpRequ lest的某个特殊标志位。
xmlHttpRequest.withCredentials = true;
将XML HttpRequest的withCredentials标志设置为true,使得向服务器发送Cookies,服务器返回响应首部字段Access- Control- Allow-Credentials: true。
如果服务器端的响应中未携带Access- -Control - Allow-Credentials: true,浏览器将不会把响应内容返回给请求的发送者。
请求消息
以下是请求消息示例:
GET /resources/access-control-with-credentials/ HTTP/1.1
Host: bar.other
User-Agent: Moilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081130 Minefield/3.1b3pre
Accept: text/html,application/ xhtml+xml,application/xml;q=0.9, */*;q=0.8
Accept-Language: en-us,en;q=0.5
o Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Referer; http://foo.example/examples/credential.html
Origin: http://foo.example
Cookie: pageAccess=2
该请求携带了请求首部字段(Cookie的相关信息。
响应消息
以下是响应消息示例:
HTTP/1.1 200 OK
Date: Mon, 01 Dec 2008 01:34:52 GMT
Server: Apache/2.0.61 (Unix) PHP/4.4.7 mod ssI/2.0.61 OpenSSL/0.9.7e mod. fastcgi/2.4.2 DAV/2 SVN/1.4.2
X-Powered-By: PHP/5.2.6
Access-Control-Allow-Origin: http://foo.example
Access-Control-Allow-Credentials: true
Cache-Control: no-cache
Pragma: no-cache
Set-Cookie: pageAccess=3; expires=Wed, 31-Dec 200801:34:53 GMT
Vary: Accept-Encoding, Origin
Content- Encoding: gzip.
Content-Length: 106
Keep- Alive: timeout=2, max=100
Connection: Keep- Alive
Content-Type: text/plain