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

假设设置不对,它一般会报错例如以下:No 'Access-Control-Allow-Origin' header is present on the requested resource。

所谓CORS,也就是Cross-Origin  Resource  Sharing,它的基本原理是通过设置HTTP请求和返回中的header,告诉浏览器该请求是合法的。这就涉及到server和浏览器两方的设置:请求的发起(Http  Request  Header)和server对请求正确的响应(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),仅仅有server正确的响应了OPTIONS请求之后。浏览器才会发起该请求。

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

GET /xin   HTTP/1.1
Origin: http://b.com
Host: a.com
Accept-Language: en-US
Connection: keep-alive
User-Agent: Mozilla/5.0...

在响应之前,当中我们的头部应该这么设置,以下是一个范例:

Access-Control-Allow-Origin: http://b.com
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: FooBar
Content-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.1
Origin: http://b.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: X-Custom-Header
Host: a.com
Accept-Language: en-US
Connection: keep-alive
User-Agent: Mozilla/5.0...

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

以下是相应的响应的头部设置:

Access-Control-Allow-Origin: http://b.com
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: X-Custom-Header
Content-Type: text/html; charset=utf-8

另一个就是Access-Control-Max-Age,它是浏览器保存的一个缓存的时间,单位是秒。在缓存过期之前,浏览器无须再次验证同一类型的请求是否合法。



辛星浅析跨域传输的CORS解决方式的更多相关文章

  1. html5的postmessage实现js前端跨域訪问及调用解决方式

    关于跨域訪问.使用JSONP的方法.我前面已经demo过了.详细见http://supercharles888.blog.51cto.com/609344/856886,HTML5提供了一个很强大的A ...

  2. 解决跨域问题-jsonp&cors

    跨域的原因 浏览器的同源策略 同源策略是浏览器上为安全性考虑实施的非常重要的安全策略. 指的是从一个域上加载的脚本不允许访问另外一个域的文档属性. 举个例子:比如一个恶意网站的页面通过iframe嵌入 ...

  3. ajax跨域请求解决方案 CORS和JSONP

    什么是跨域: 只要协议.域名.端口有任何一个不同,都会被当成不同的域.而由于浏览器的同源策略(同源策略:域名.协议.端口均相同),浏览器之间要隔离不同域的内容,禁止互相操作,不能执行其他网站的js.所 ...

  4. 浅谈跨域问题,CORS跨域资源共享

    1,何为跨域? 在理解跨域问题之前,你先要了解同源策略和URL,简单叙述: 1)同源策略 三同:协议相同,域名相同,端口相同: 目的:保证用户信息安全,防止恶意网站窃取数据.同源策略是必须的,否则co ...

  5. System.Web.Http.Cors配置跨域访问的两种方式

    System.Web.Http.Cors配置跨域访问的两种方式 使用System.Web.Http.Cors配置跨域访问,众多大神已经发布了很多文章,我就不在详细描述了,作为小白我只说一下自己的使用心 ...

  6. 【fetch跨域请求】cors

    当使用fetch 发起跨域请求时,CORS(跨域资源共享Cross-origin resource sharing) 请求fetch const body = {name:"Good boy ...

  7. c# WebApi之解决跨域问题:Cors

    什么是跨域问题 出于安全考虑,浏览器会限制脚本中发起的跨站请求,浏览器要求JavaScript或Cookie只能访问同域下的内容.由于这个原因,我们不同站点之间的数据访问会被拒绝. Cors解决跨域问 ...

  8. 跨域资源共享(CORS)--跨域ajax

    几年前,网站开发者都因为ajax的同源策略而撞了南墙.当我们惊叹于XMLHttpRequest对象跨浏览器支持所带来的巨大进步时,我们很快发现没有一个方法可以使我们用JavaScript实现请求跨域访 ...

  9. 允许跨域资源共享(CORS)携带 Cookie (转载)

    如何让CORS携带Cookie CORS 是一个 W3C 标准,全称是“跨域资源共享”(Cross-origin resource sharing).默认浏览器为了安全,遵循“同源策略”,不允许 Aj ...

随机推荐

  1. Codeforces 474F - Ant colony

    注意到每个区间生存下来的蚂蚁的长度等于区间的gcd 于是可以先预处理出区间的gcd 然后二分查找就好了 预处理gcd我这里用的是倍增法 总的时间复杂度O(NlogN) /* Cf 271F 倍增求区间 ...

  2. 【HDU4391】【块状链表】Paint The Wall

    Problem Description As a amateur artist, Xenocide loves painting the wall. The wall can be considere ...

  3. Winform控件Enable=false显示优化

    在B/S开发中(ASP.NET),往往可以css样式表来让页面控件更加美观,但是在C/S中(Winform)里面,我们则需要通过其他取巧的 方式来实现.例如:当你因为某个需求需要将控件设置为Reado ...

  4. 【转载】详细解读C#中的 .NET 弱事件模式

    你可能知道,事件处理是内存泄漏的一个常见来源,它由不再使用的对象存留产生,你也许认为它们应该已经被回收了,但不是,并有充分的理由. 在这个短文中(期望如此),我会在 .Net 框架的上下文事件处理中展 ...

  5. python进度条代码

    import sys import time def view_bar(num,total): rate = num / total rate_num = int(rate * 100) r = ' ...

  6. 七天学会SALTSTACK自动化运维 (2)

    七天学会SALTSTACK自动化运维 (2) 导读 Grains Pillar 总结 参考链接 导读 上一篇主要介绍了安装和基本的使用方法,但是我认为如果理解了相关概念的话,使用会更加顺手,因为毕竟每 ...

  7. Swift-MJ

    1.声明变量 常量 声明变量:var age = 10 声明常量:let age = 10 (不加分号,除非多条语句写在同一行) 二进制前缀:0b(必须小写) 八进制前缀:0o 十六进制前缀:0x 2 ...

  8. Egret 纹理、计时器

    1. 九宫切 典型例子就是圆角矩形的拉伸问题. 先去P一张绿色的圆角矩形. private createGameScene():void { var box:egret.Bitmap = new eg ...

  9. WPF学习笔记-TextBox光标位置如何放到最后?

    TextBox光标位置如何放到最后? 使用SelectionStart : TextBox.SelectionStart = TextBox.Text.Length;

  10. Github博客地址

    欢迎访问我的Github博客: J.R.Smith_blog