1. 浏览器同源策略是隔离潜在恶意文件的安全机制,限制信息传递和使用的边界,不是信息的保密机制。<img><script><link>以及表单提交均可实现跨域请求,但可能会不一样程度受同源策略的限制,因浏览器不一样而异; 2. 跨域资源共享(CORS)是一个W3C标准,是在客户端和服务端同时遵循的状况下执行的,整个CORS通讯过程,都是浏览器自动完成,在编码上与同源资源共享并没有不一样(CORS交互中使用WithCredentials除外); 3. 若是客户端不支持跨域资源共享(CORS),则信息的传递和使用将可能受同源策略限制,但服务端返回的任然是正常的HTTP响应; 4. IE未将端口号加入到同源策略的组成部分之中,Chrome 和 Firefox不容许从 HTTPS 的域跨域访问 HTTP。
下表给出了相对http://store.company.com/dir/page.html同源检测的示例:html
URL | 结果 | 缘由 |
---|---|---|
http://store.company.com/dir2/other.html |
成功 | |
http://store.company.com/dir/inner/another.html |
成功 | |
https://store.company.com/secure.html |
失败 | 不一样协议 ( https和http ) |
http://store.company.com:81/dir/etc.html |
失败 | 不一样端口 ( 81和80) |
http://news.company.com/dir/other.html |
失败 | 不一样域名 ( news和store ) |
1. document.domain:不一样子域下经过设置document.domain为相同的父级域来共享cookie 和 DOM (iframe) document.domain = "company.com:8080"; 2. 片断识别符(fragment identifier):在使用iframe场景中,父子页经过URL #后的fragment来跨域传递数据 window.onhashchange = function () { var message = window.location.hash; // ... } 3. window.name:不管是否同源,只要在同一个窗口里,前一个网页设置了这个属性,后一个网页能够读取它。window.name容量很大,能够放置很是长的字符串 var data = document.getElementById('myIframe').contentWindow.name; 4. window.postMessage(跨文档通讯Cross-document Messaging):这是HTML5新增的API var popup = window.open('http://bbb.com', 'title'); popup.postMessage('Hello World!', 'http://bbb.com'); 5. jsonp:最大特色就是简单适用,老式浏览器所有支持,服务器改造很是小; 6. WebSocket:它使用ws://(非加密)和wss://(加密)做为协议前缀。该协议不支持同源政策,只要服务器支持,就能够经过它进行跨源通讯; 7. Proxy Server:在本域以内增长Proxy Server节点负责域外数据的访问代理 8. CORS:此处再也不赘述
跨域资源共享(CORS)请求:一般CORS请求可分为两类,一类是简单请求,另外一类则是预检请求。不管何种请求类型,只要服务端响应中未包含正确的首部如Access-Control-Allow-Origin: http://foo.example等,浏览器将报告错误。json
简单请求:简单请求与普通请求相比,多了请求首部字段Origin,形如Origin: http://foo.example,服务端响应时则多了响应首部字段Access-Control-Allow-Origin,形如Access-Control-Allow-Origin: http://foo.example 或者 *。简单请求须知足全部下述条件:跨域
GET
HEAD
POST
Content-Type
:仅POST方法的Content-Type值等于下列之一才算做简单请求:text/plain
multipart/form-data
application/x-www-form-urlencoded
Accept
Accept-Language
Content-Language
Content-Type
DPR
Downlink
Save-Data
Viewport-Width
Width
预检请求:需预检的请求必须首先使用 OPTIONS
方法发起一个预检请求到服务器,以获知服务器是否容许该实际请求,若是服务端赞成,再发送实际请求,这样能够避免跨域请求对服务器的用户数据产生未预期的影响。预检请求须知足全部下述条件:浏览器
PUT
DELETE
CONNECT
OPTIONS
TRACE
PATCH
Accept
Accept-Language
Content-Language
Content-Type
(but note the additional requirements below)DPR
Downlink
Save-Data
Viewport-Width
Width
Content-Type
的值不属于下列之一:
application/x-www-form-urlencoded
multipart/form-data
text/plain
var invocation = new XMLHttpRequest(); var url = 'http://bar.other/resources/credentialed-content/'; function callOtherDomain(){ if(invocation) { invocation.open('GET', url, true); invocation.withCredentials = true; invocation.onreadystatechange = handler; invocation.send(); } }
可是,若是服务器端的响应中未携带 Access-Control-Allow-Credentials: true 或者
安全Access-Control-Allow-Origin: *
,浏览器将不会把响应内容返回给请求的发送者。
1. 浏览器的同源策略服务器
2. 浏览器同源政策及其规避方法cookie
3. 跨域资源共享 CORS 详解app
4. HTTP访问控制(CORS)cors