一、CORS方法
本人浅谈
二、JSONP(填充式JSON)
发出请求域定义回调函数,响应请求域返回函数执行字符串(即:‘functionName (data)’),并将要发送的数据以参数形式填充入所返回的字符串中。说白了就是XXS攻击(js代码恶意植入)
可执行原因
借助了<script>
标签src
资源不受同源策略限制的特性。在此,还有如下标签src
加载不受同源限制,<link href='xxx'>、<img src='xxx' />、<iframe src='xxx'>
。
只允许get请求原因
碍于标签<script>
获取参数方式,便使用get方法将回调函数名传给后端服务器
<body>
<div id="divCustomers">
</div>
<script type="text/javascript">
function callbackName(result, methodName) {
console.log(result)
console.log(methodName)
var html = '<ul>';
for (var i = 0; i < result.length; i++) {
html += '<li>' + result[i] + '</li>';
}
html += '</ul>';
document.getElementById('divCustomers').innerHTML = html;
}
</script>
<script type="text/javascript" src="https://www.runoob.com/try/ajax/jsonp.php?jsoncallback=callbackName"></script>
</body>
三、修改document.domain,实现不同子域间的通信
我们先说说document.domain
的作用是获取/设置当前文档原始域名,遵循同源策略。
既然说是遵循同源策略,但是有哪里来说的跨域呢?这其实是通过document.domain
的修改,将两个处于同一父域名下的子域名,进行域名提升,全都变为父域名,从而实现严格的同源,已达到可相互通信的目的。
域名层级图
在此,要实现在a.test.com域名下的a.html与在b.test.com域名下的b.html通信时
// a.html
document.domain = 'test.com'
// b.html
document.domain = 'test.com'
这便使两个文档实现了严格的同源,从而实现可互相通信。