辛星浅析跨域传输的CORS解决方案

来源:互联网 发布:下载软件游戏 编辑:程序博客网 时间:2024/05/26 09:56

    首先我们有一个概念,那就是“同源准则",也就是same-origin  policy,它要求一个网站(协议+主机+端口号)来确定的脚本、XMLHttpRequest和Websocket无权去访问另一个网站的内容。

     如果设置不正确,它通常会报错如下:No 'Access-Control-Allow-Origin' header is present on the requested resource。

     所谓CORS,也就是Cross-Origin  Resource  Sharing,它的基本原理是通过设置HTTP请求和返回中的header,告诉浏览器该请求是合法的。这就涉及到服务器和浏览器双方的设置:请求的发起(Http  Request  Header)和服务器对请求正确的响应(Http  Response  Header).

     我们可以使用原生的javascript来通过XMLHttpRequest或者XDomainRequest来发起请求,我们也可以通过jQuery的$.ajax()来发起XHR或者CORS请求,不过该方法不支持IE下的XDomainRequest,我们需要另外的插件来解决这个问题。

      其中通过jQuery调用的范例乳腺癌:

       $.ajax({

       type:'GET',

       url:'http://www.aaa.com',

       contentType:'text/plain',

       success:function(){},

        error:function(){}

        }});

        根据请求的内容不同,浏览器会需要添加对应的Header或者发起额外的请求。其中的细节都由浏览器来处理,对于用户来将是透明的。

        一般我们将CORS分为两类:(1)简单请求   (2)不是那么简单的请求

        所谓简单请求,就是请求类型必须是GET、POST、HEAD三者中的一个,请求头Header中只能包含:Accept、Accept Language、Content  Language、Last Event ID、Content Type,而且Content Type只接受application/x-www-form-urlencoded、multipart/form-data、text/plain这三种。

       除了上面的条件,比如PUT、DELETE或者Content Type是application/json,均为"不是那么简单的请求".这种请求浏览器会在真实请求之前,额外发起一次类型为OPTIONS的请求(preflight  request),只有服务器正确的响应了OPTIONS请求之后,浏览器才会发起该请求。

     对于简单请求,下面是b.com向a.com发起的一次GET请求的范例:

GET /xin   HTTP/1.1Origin: http://b.comHost: a.comAccept-Language: en-USConnection: keep-aliveUser-Agent: Mozilla/5.0...
    在响应之前,其中我们的头部应该这么设置,下面是一个范例:

Access-Control-Allow-Origin: http://b.comAccess-Control-Allow-Credentials: trueAccess-Control-Expose-Headers: FooBarContent-Type: text/html; charset=utf-8

    其中Access-Control-Allow-Origin是Server同意跨域访问的域名列表,如果我们允许任意网站请求资源,此处可以填写"*",而Access-Control-Expose-Headers可以设置返回额Header以传递数据,简单请求中允许使用的Header包括:Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma。

     对于不是那么简单的去年跪求,下面是一个范例:

OPTIONS /cors HTTP/1.1Origin: http://b.comAccess-Control-Request-Method: PUTAccess-Control-Request-Headers: X-Custom-HeaderHost: a.comAccept-Language: en-USConnection: keep-aliveUser-Agent: Mozilla/5.0...

    其中Access-Control-Request-Method代表真实请求的类型,而Access-Control-Request-Headers则代表真实请求的请求头的key内容。服务器在验证了这两项内容的合法性之后才会同意浏览器发起真实的请求。 

    下面是对应的响应的头部设置:

Access-Control-Allow-Origin: http://b.comAccess-Control-Allow-Methods: GET, POST, PUTAccess-Control-Allow-Headers: X-Custom-HeaderContent-Type: text/html; charset=utf-8
      还有一个就是Access-Control-Max-Age,它是浏览器保存的一个缓存的时间,单位是秒,在缓存过期之前,浏览器无须再次验证同一类型的请求是否合法。
   
   

       

      


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 优易学车学员版登录不了怎么办 先科移动dvd主板坏了怎么办 离职单位不出劳动解除书怎么办 离职后一级建造师注册证怎么办 京牌货车报废挂靠公司不给办怎么办 二建挂靠注册证书到期了怎么办 二建证书挂靠公司不给钱怎么办 二建拿到证书原单位不解锁怎么办 凯云软件清单锁定只读了怎么办 苹果笔记本鼠标触摸板没反应怎么办 苹果笔记本键盘和触摸板失灵怎么办 苹果手机输入密码显示已停用怎么办 苹果7p手机刷机黑屏了怎么办 苹果5s来电接听屏幕卡顿怎么办? 手机摔了一下触屏失灵怎么办 小米手机摔了一下触屏失灵怎么办 苹果6sp触摸ic坏了怎么办 苹果4s屏幕摔裂了怎么办 新换的手机内屏颜色太亮怎么办 苹果手机摔了一下屏幕失灵怎么办 苹果手机6s屏幕坏了怎么办 苹果6s屏幕摔坏了怎么办 苹果手机屏幕进油了屏幕变暗怎么办 苹果手机不小心屏幕进油了怎么办 苹果6充电插口螺丝口坏了怎么办 苹果5s手机安装屏幕翘边怎么办 苹果手机摔了一下触摸屏失灵怎么办 苹果手机摔了下触摸屏失灵怎么办 苹果6老是屏幕失灵或者闪屏怎么办 华为荣耀8手触摸屏乱跳失灵怎么办 苹果5s屏幕有半边竖纹怎么办 苹果5s电源键坏了怎么办 苹果6s手机触屏失灵怎么办 不能取电池的手机触屏不灵怎么办? 7p主板触摸ic坏了怎么办 小米六手机摔了一下屏幕失灵怎么办 魅蓝5s触屏失灵怎么办 苹果手机键盘字母顺序乱了怎么办 红米手机进水后屏幕失灵怎么办 苹果7plus主屏按键坏了怎么办 苹果六手机上的红色变成粉色怎么办