簡單的理解就是由於javascript同源策略的限制(同源策略: javascript或是cookie 默認只容許訪問同域名下的內容),例如a.com
下不能訪問b.com
下的內容,這就是跨域.javascript
先看看域名的組成:
當協議
子域名
主域名
端口號
任意一個不相同,就算是不一樣域
,php
jsonpjsonp
利用的是script
標籤來實現(畢竟script
不存在跨域問題),java
只支持GET
請求,不支持POST
請求
通常在URL
中傳入一個callback
的參數,用來調用函數json
function getJSON(url,fn){ // 建立 script標籤 var oScript = document.createElement('script'); oScript.src = url; document.body.appendChild(oScript); var reg = /callback=([^&]+)/; var fnName = url.match(reg)[1]; // 掛載window window[fnName] = fn; // 函數在服務器端 執行 oScript.onload = function(){ document.body.removeChild(oScript); delete(window[fnName]); } }
PHP
頁面:跨域
echo $_GET['callback'].'({"name":"hello"})';
以上就是jsonp
方法的主要實現.瀏覽器
畢竟 jsonp
不能實現POST
請求 服務器
CORS
這個方法既能夠實現post
又能夠實現 get
請求cookie
可是這個方法IE10
如下不支持基本思想
: 使用自定義的HTTP頭部
讓瀏覽器與服務器進行溝通,從而決定請求或響應是應該成功仍是 應該失敗。
在php
頁面添加一下代碼:app
header("Access-Control-Allow-Origin:*"); header("Access-Control-Allow-Methods","GET,POST");
CORS
function createCORS(fn,url){ var xhr = new XMLHttpRequest(); if('withCredentials' in xhr){ xhr.open(fn,url,true); }else if(typeof XDomainRequest() != 'undefined'){ cxhr = new XDomainRequest(); cxhr.open(fn,url); } }