跨域(入門)

JS跨域

同源策略javascript

所謂「同源」,就是「三個相同」:協議相同、域名相同、端口相同。
同源策略的目的:保證用戶信息的安全,防止惡意網站竊取數據。
若是是非同源,共有三種行爲會受到限制:
1.Cookie、LocalStorage、IndexDB沒法讀取;
2.DOM沒法獲取;(主要場景是ifame跨域的狀況,不一樣域名的iframe是限制互相訪問的)
3.AJAX請求不能發送;html

跨域的解決方法

跨域資源共享(CORS)前端

html5新增的標準,IE10如下不支持。
CORS是W3C的標準,全稱是跨域資源共享(Cross-Origin Resource sharing)。CORS定義了必須在訪問跨域資源時,瀏覽器與服務器應該如何溝通。它的思想就是使用自定義的HTTP頭部讓瀏覽器與服務器進行溝通,從而決定請求或響應是成功仍是失敗。
使用:
對於前端,咱們仍是正常使用xhr對象發送ajax請求。惟一須要注意的是,咱們須要設置xhr中的withCredentials爲true,否則沒法傳遞cookie,xhr.withCredentials=true;
對於服務端,須要在response header中設置以下兩個字段:
Access-Control-Allow-Origin:http://www.yourhost.com
Access-Control-Allow-Credentials:truehtml5

JSONPjava

JSONP的原理:在頁面上引入不一樣域上的js腳本文件是能夠的,因此能夠經過動態建立script標籤,而後利用src屬性進行跨域。經過將前端方法做爲參數傳遞到服務器端,而後由服務器端注入參數以後再返回,實現服務器端向客戶端通訊。ajax

注:src請求都必須是get方法,就像你在瀏覽器地址欄輸入地址回車同樣。跨域

function fun(fata){
    console.log(data);
}
var body=document.getElementsByTagName('body')[0];
var script=document.getElement('script');
script.type='text/javascript';
script.src='demo.js?callback=fun';
body.appendChild(script);
//返回的js腳本直接會執行,就執行已經定義好的fun函數,而且把數據傳入進來。
fun({"name":"name"})

CORS VS JSONP
都能解決ajax直接請求普通文件存在跨域無權訪問的問題
1.JSONP只能實現get請求,而CORS支持全部類型的http請求
2.使用CORS,開發者可使用普通的XHR發起請求和得到數據,比起JSONP有更好的錯誤處理
3.JSONP主要被老的瀏覽器支持,它們每每不支持CORS,而現代瀏覽器都支持CORS瀏覽器

document.domain安全

修改document.domain的方法只適用於不一樣子域的框架間的交互。
對於主域名相同,而子域名不一樣的狀況,可使用document.domain來跨域 這種方式很是適用於iframe跨域的狀況,好比:
a頁面地址爲 http://a.yourhost.com 
b頁面爲 http://b.yourhost.com
這樣就能夠經過分別給兩個頁面設置 document.domain = http://yourhost.com 來實現跨域。
以後,就能夠經過 parent 或者 window['iframename']等方式去拿到iframe的window對象了。服務器

postMessage

postMessage是html5的一個API,能夠解決多窗口、窗口和iframe之間的消息通訊的跨域問題。
postmessage(data, origin),其中data指的就是須要傳遞的數據,origin指的是具體的數據源地址(包括協議+域名+端口)。而後window對message事件進行監聽。

<iframe id="iframe" src="http://next.com/next.html"></iframe>
<input id="msg" type="text" placeholder="輸入要發送的消息">
<button id="send">發送</button>

document.getElementById('send').onclick = function() {
    var msg = document.getElementById('msg').value;
    var iframeWindow = document.getElementById('iframe').contentWindow;
    iframeWindow.postMessage(msg,"http://next.com/next.html");
}

<div>
    <h2>如下是接收到的消息:</h2>
    <section id="msg">
         
    </section>
</div>

window.addEventListnerner('message',handle,false){//window對message時間監聽
}
function handle(event){
    if(event.origin==='http://source.com'){
        document.getElementById('msg').innerHTML=event.data;
    }
}
相關文章
相關標籤/搜索