跨域
- 什么是跨域?
- 非同源限制
- 跨域解决方案
- CORS
- JSONP
- 服务器进行第三方代理
- webscoket
- window.postMessage
什么是跨域?
同源策略:协议相同、域名相同、端口号相同 的两个页面被认为是同源。
由一个页面的 js 访问不同源的页面内容,被认为是跨域,跨域是不安全的,会被浏览器拦截掉。
非同源限制
- 无法读取非同源网页的 Cookie、LocalStorage 和 IndexedDB
- 无法接触非同源网页的 DOM
- 无法向非同源地址发送 AJAX 请求
跨域解决方案
CORS
CORS 是跨域资源分享(Cross-Origin Resource Sharing)的缩写。它是 W3C 标准,属于跨源 AJAX 请求的根本解决方法。
服务器端对于CORS的支持,主要是通过设置Access-Control-Allow-Origin来进行的。如果浏览器检测到相应的设置,就可以允许Ajax进行跨域的访问。
response.setHeader("Access-Control-Allow-Credentials", "true");
JSONP
网页通过添加一个<script>元素,向服务器请求 JSON 数据,服务器收到请求后,将数据放在一个指定名字的回调函数的参数位置传回来。
<script src="http://test.com/data.php?callback=dosomething"></script>
// 向服务器test.com发出请求,该请求的查询字符串有一个callback参数,用来指定回调函数的名字
// 处理服务器返回回调函数的数据
<script type="text/javascript">
function dosomething(res){
// 处理获得的数据
console.log(res.data)
}
</script>
服务器进行第三方代理
💡 Tips:webpack代理请求,proxy代理,Nginx代理,服务器访问第三方服务器等
webscoket
let socket = new WebSocket("ws://localhost:3000");
socket.onopen = function(){
socket.send("我叫xxx");
}
socket.onmessage = function(e){
console.log(e.data);
}
window.postMessage
💡 Tips:它可用于解决以下方面的问题:页面和其打开的新窗口的数据传递,多窗口之间消息传递,页面与嵌套的iframe消息传递
// 父窗口打开一个子窗口
var openWindow = window.open('http://test2.com', 'title');
// 父窗口向子窗口发消息(第一个参数代表发送的内容,第二个参数代表接收消息窗口的url)
openWindow.postMessage('Nice to meet you!', 'http://test2.com');
// 监听 message 消息
window.addEventListener('message', function (e) {
console.log(e.source); // e.source 发送消息的窗口
console.log(e.origin); // e.origin 消息发向的网址
console.log(e.data); // e.data 发送的消息
},false);