跨域资源共享

跨域资源共享

最大作用:跨域访问

CORS是什么

全称Cross-Origin Resource Sharing ,译为跨域资源共享,新增了一组http首部字段,允许服务器声明哪些源站有权限访问哪些资源

跨域资源共享机制的工作原理主要应用于三个场景:

  1. 简单请求

  2. 预检请求(得到服务器的认证)

  3. 认证请求

简单请求是什么

满足所有下述条件,则该请求可视为‘简单请求

  • 使用下列方法之一:get,head或者post

  • 不得人为设置下列集合之外的其他首部字段:Accept,Accept-Language,Content-Language,Content-Type

  • Content-Type的值仅限于下列三者之一:

    • text/plain

    • multipart/form-data

    • application/x-www-form-unlencoded

请求消息
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值