跨域总结
跨域
为什么出现跨域
浏览器同源政策的限制,如果缺少同源政策,则浏览器的正常功能可能受到影响。同源:两个页面具有相同的协议,主机和端口号
什么是跨域
当一个请求url的协议,域名,端口三者之间任意一个与当前页面url不同即为跨域
当前页面url | 被请求页面url | 是否跨域 | 原因 |
---|---|---|---|
http://www.test.com/ | http://www.test.com/index.html | 否 | 同源(协议、域名、端口号相同) |
http://www.test.com/ | https://www.test.com/index.html | 跨域 | 协议不同(http/https) |
http://www.test.com/ | http://www.baidu.com/ | 跨域 | 主域名不同(test/baidu) |
http://www.test.com/ | http://blog.test.com/ | 跨域 | 子域名不同(www/blog) |
http://www.test.com:8080/ | http://www.test.com:7001/ | 跨域 | 端口号不同(8080/7001) |
非同源限制
1.无法读取非同源网页的Cookie,LocalStorage和IndexdDB 2.无法接触非同源网页的DOM 3.无法向非同源地址发送AJAX请求
跨域解决办法
1.设置document.domain解决无法读取非同源网页的Cookie问题 因为浏览器是通过document.domain属性来检查两个页面是否同源,设置相同的document.domain就可以共享Cookie(仅限于主域相同,子域不同的应用场景) 2.跨文档通信API:window.postMessage() 通过psotMessage方法实现父网页向子网页发消息,子网页也可向父网页发消息 可以实现: 1)页面和其他新窗口的数据传递 2)多窗口之间消息传递 3)页面与嵌套的iframe之间消息传递 3.JSONP 客户端和服务器发送数据的常用方法,只能get方法,不能post方法 4.CORS 跨域资源分享 5.webpack本地代理 6.websocket 7.Nginx反向代理