跨域有幾種處理方式?


前言

本文簡單介紹什么是跨域,出現跨域的情況以及跨域的幾種處理方式。

一、什么是跨域

我們先回顧一下域名地址的組成:

http:// www . google : 8080 / script/jquery.js

  http:// (協議號)

  www  (子域名)

  google (主域名)

   8080 (端口號)

  script/jquery.js (請求的地址)

* 當協議、子域名、主域名、端口號中任意一各不相同時,都算不同的“域”。

* 不同的域之間相互請求資源,就叫“跨域”。

比如:http://www.a.com/index.html 請求 http://www.b.com/index.html的數據 

 二、出現跨域問題的情況

由於在工作中需要使用AJAX請求其他域名下的請求,但是會出現拒絕訪問的情況,這是因為基於安全的考慮,AJAX只能訪問本地的資源,而不能跨域訪問。

比如說你的網站域名是aaa.com,想要通過AJAX請求bbb.com域名中的內容,瀏覽器就會認為是不安全的,所以拒絕訪問。

會出現跨域問題的幾種情況:

編號 url 說明 是否允許通信
1

http://www.a.com/a.js

http://www.a.com/b.js

同一域名下 允許
2

http://www.a.com/a/a.js

http://www.a.com/b/b.js

同一域名不同文件夾 允許
3

http://www.a.com:8080/a.js

http://www.a.com:9090/a.js

同一域名不同端口號 不允許
4

http://www.a.com/a.js

https://www.a.com/b.js

同一域名不同協議 不允許
5

http://www.a.com/a.js

http://192.168.4.158/b.js

域名與域名對應的ip地址 不允許
6

http://www.a.com/a.js

http://wwww.a.com/b.js

主域名相同,子域名不同 不允許
7

http://www.a.com/a.js

http://www.b.com/b.js

不同域名 不允許

 

三、處理跨域的方法1 -- 代理

這種方式是通過后台(ASP、PHP、JAVA、ASP.NET)獲取其他域名下的內容,然后再把獲得內容返回到前端,這樣因為在同一個域名下,所以就不會出現跨域的問題。

比如在A(www.a.com/sever.php)和B(www.b.com/sever.php)各有一個服務器,A的后端(www.a.com/sever.php)直接訪問B的服務,然后把獲取的響應值返回給前端。也就是A的服務在后台做了一個代理,前端只需要訪問A的服務器也就相當與訪問了B的服務器。這種代理屬於后台的技術,所以不展開敘述。

 

四、處理跨域的方法2 -- JSONP

假設在http://www.a.com/index.php這個頁面中向http://www.b.com/getinfo.php提交GET請求,那么我們在www.a.com頁面中添加如下代碼:

//創建一個script元素

var  Scr = document.reateElement('script');

//聲明類型

Scr.type='text/javascript';

//添加src屬性,引入跨域訪問的url

Scr.src='http://www.b.com/gerinfo.php';

//在頁面中添加新創建的script元素

document.getElementsByTagName('head')[0].appendChild(Scr)

 

當GET請求從http://www.b.com/getinfo.php返回時,可以返回一段JavaScript代碼,這段代碼會自動執行,可以用來負責調用http://www.a.com/index.php頁面中的一個callback函數。看下面一個列子:

www.b.com頁面中:

<script>

  alert('hello  我是b');

</script>

注意:JSONP只支持 “GET” 請求,但不支持 “POST” 請求。

五、處理跨域的方法3 -- XHR2

“XHR2” 全稱 “XMLHttpRequest Level2” 是HTML5提供的方法,對跨域訪問提供了很好的支持,並且還有一些新的功能。

* IE10以下的版本都不支持

* 只需要在服務器端頭部加上下面兩句代碼:

header( "Access-Control-Allow-Origin:*" );

header( "Access-Control-Allow-Methods:POST,GET" );


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM