先看看域名組成: javascript
http:// | www.baidu.com | :80 | /abc/123 | ?id=12 |
【協議】 | 【地址】 | 【端口】 | 【文件】 | 【參數】 |
咱們再來看看什麼時候纔算跨域:php
當協議或者地址或者端口號不一樣的時候纔算是不一樣的域,而當你在不一樣的域之間有數據傳遞的時候,叫作跨域。前端
看到這裏你還不理解什麼叫跨域的話,那就來看看發生跨域的狀況java
url | 說明 | 是否跨域 |
http://www.baidu.comajax https://www.baidu.com跨域 |
不一樣協議 | 是 |
http://www.baidu.com服務器 http://www.163.comapp |
不一樣地址 | 是 |
http://www.baidu.com:80函數 http://www.baidu.com:8080url |
不一樣端口 | 是 |
http://www.baidu.com/a.js http://192.168.0.122/a.js |
域名對應的ip地址 | 是 |
http://www.baidu.com/abc/a.php http://www.baidu.com/123/a.php |
同一域名不一樣文件/文件夾 | 否 |
知道跨域什麼時候發生了,有時業務須要,要用到跨域,這個時候就會有問題了。ajax不是不能跨域嗎?那咱們就是要想辦法使其能跨域!!
方法1——使用代理:
這種方式是經過後臺(ASP、PHP、JAVA、ASP.NET)獲取其餘域名下的內容,而後再把得到內容返回到前端,這樣由於在同一個域名下,因此就不會出現跨域的問題。
方法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" );