一、同源策略
1、同源
指两个页面的协议、端口和域名都相同,则两个页面是具有相同的源
2、同源策略
同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。
3、不受同源策略限制的有哪些
- script标签嵌入跨域脚本。语法错误信息只能被同源脚本中捕捉到。
- link 标签嵌入CSS。由于CSS的松散的语法规则,CSS的跨域需要一个设置正确的 HTTP 头部 Content-Type 。不同浏览器有不同的限制: IE, Firefox, Chrome, Safari (跳至CVE-2010-0051)部分 和 Opera。
- 通过 img 展示的图片。支持的图片格式包括PNG,JPEG,GIF,BMP,SVG,…
- 通过 video 和 audio 播放的多媒体资源。
- 通过 object、 embed 和 applet 嵌入的插件。
- 通过 font-face 引入的字体。一些浏览器允许跨域字体( cross-origin fonts),一些需要同源字体(same-origin fonts)。
- 通过 iframe 载入的任何资源。站点可以使用 X-Frame-Options 消息头来阻止这种形式的跨域交互
二、前端跨域方法
1、iframe + document.domain
使用ducument.domain实现跨域必须满足以下几点: - 这两个域名必须属于同一个基础域名
- 所用的协议,端口都要一致
在a页面中 xxx.test.com中嵌套b页面(yy.xx.test.com)
此时a和b页面不是同源的,iframe中的b页面如果想取a页面中的某个参数是涉及到跨域问题,因此可以将两个页面的domain都设置成test.com
即:a和b页面都添加:document.domain = ‘test.com’
2、jsonp实现跨域请求
原理:因为script标签不受同源策略的限制,因此在访问接口时服务端可以返回一个script标签内嵌入内容,但是常用的jquery的jsonp来实现跨域请求,jquery将JSONP方法进行了封装,使用JQuery提供的方法变得非常简单
<script type="text/javascript">
$.ajax({
type: "get",
async: false,
url: "http://localhost:8546/Service.ashx",
dataType: "jsonp",
success: function (data) {
alert(data);
},
error: function () {
alert('fail');
}
});
</script>
3、iframe + postMessage
postMessage方法允许来自不同源的脚本采用异步方式进行有限的通信,可以实现跨文本档、多窗口、跨域消息传递。其是h5特性,可以安全地实现跨源通信
语法:
otherWindow.postMessage(message, targetOrigin, [transfer])// 向指定的窗口发送消息
- otherWindow:他窗口的一个引用,比如iframe的contentWindow属性、执行window.open返回的窗口对象、或者是命名过或数值索引的window.frames。
- message:将要发送到其他 window的数据
- targetOrigin:通过窗口的origin属性来指定哪些窗口能接收到消息事件,其值可以是字符串"*"(表示无限制)或者一个URI
window.addEventListener("message", receiveMessage, false); // 其他窗口可以监听分发的message