前言
本文簡單介紹什么是跨域,出現跨域的情況以及跨域的幾種處理方式。
一、什么是跨域
我們先回顧一下域名地址的組成:
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" );