饥人谷技术博客

跨域的几种解决方式

2019-01-15  本文已影响2人  202b37dbe4bd

什么是跨域?

页面向一个与当前域名不同的页面或服务器发送请求的行为。

什么叫域名不同?

两个url的协议、域名或者端口有一个或多个不同就叫域名不同。

跨域会导致什么问题?

浏览器出于安全角度默认会阻止这种行为。

如何解决?

1. JSONP

利用<script>标签可以请求跨域文件的特性,在需要发送请求的时候生成一个新的<script>标签,然后令其src属性为一个指定的js文件并且将参数作为url的参数。

var newScript = document.createElement("script");
var url = 'http://www.example.com/?index=0&length=5';
newScript.src = url;
newScript.id = 'temp';
document.body.appendChild(newScript); //插入script后会自动发送请求
document.querySelector('script#temp').remove(); //删除script节点

// 请求返回后被调用的方法
function showNews(data){
/*
    处理代码
*/
}

当服务器的js文件接收到请求时,可以根据url中的参数来确定返回的数据,并且返回一个方法的调用(这个方法已经在前端页面声明过),方法的参数就是要返回的数据。


服务器端返回方法的调用

页面在<script>标签加载完成后会自动执行返回的方法。
这样就实现了跨域请求数据。

2. CORS

当一个服务器想要接受某个其他域的请求时,可以在响应头的Access-Control-Allow-Origin属性中添加允许请求的url。

Access-Control-Allow-Origin: https://www.example.com

当页面请求一个跨域请求并且成功返回数据以后,浏览器会比较这次请求的请求头的origin属性是否存在于响应头的Access-Control-Allow-Origin里面,如果存在就会显示请求结果,如果不存在就会报跨域错误。

3.降域

将两个根域名相同的页面或者iframe的document.domain设置为他们的根域名,之后它们之间可以发送ajax请求。

4.window.postMessage()

通过这个方法可以实现两个不同域名的页面之间通信,接受方可以监听window.message事件,并且通过判断origin来确定请求来源的合法性。

上一篇 下一篇

猜你喜欢

热点阅读