跨域問題解決方案

跨域概念介紹

為了保證用戶信息的安全,防止惡意的網(wǎng)站竊取數(shù)據(jù),引入了同源政策。同源指協(xié)議、域名、端口三者相同,同源政策就是限制非同源訪問測策略。

隨著互聯(lián)網(wǎng)的發(fā)展,同源政策也越來越嚴格。目前非同源主要有如下三種限制:

  1. Cookie、LocalStorage 和 IndexDB 無法讀取;
  2. DOM 無法獲得;
  3. AJAX 請求不能發(fā)送;

非同源訪問引發(fā)的問題就是跨域訪問問題,有些時候需要跨域協(xié)調(diào)處理問題,那么如何解決呢?

cookie

  1. 保持兩個網(wǎng)站的 document.domain 相同,cookie即可以訪問
  2. 片段標識符:在父子窗口的場景可以通過片段標識符(location.hash)來修改或獲取信息。通過監(jiān)聽 hashchange 事件來獲取更新
  3. window.name 修改
  4. PostMessage

LocalStorage解決方案

  1. PostMessage

ajax

ajax和其它兩種跨域情況不一樣,前面兩種僅僅是獲取數(shù)據(jù)。ajax可以獲取數(shù)據(jù),同時修改數(shù)據(jù)。我們可以通過三種方式來規(guī)避跨域問題。

  • JSONP
  • WebSocket
  • CORS

JSONP 是通過動態(tài)添加一個腳本到頁面,通過回調(diào)函數(shù)來實現(xiàn)跨域ajax調(diào)用。其核心原理是將ajax調(diào)用修改為資源訪問,將調(diào)用權(quán)限賦給對方;由對方使用回調(diào)函數(shù)處理。

window.onload = function () {
  addScriptTag('http://mydemo.com/jsonp?callback=foo');
}
function jsonpCallback(jsonpresult) {
  console.log(jsonpresult);
}

WebSocket 是一種操作tcp/udp的實現(xiàn)方式,通過底層通信技術(shù)解決通信問題。

CORS是跨源資源分享(Cross-Origin Resource Sharing)的縮寫。它是W3C標準,是跨源AJAX請求的根本解決方法。相比JSONP只能發(fā)GET請求,CORS允許任何類型的請求。

不管哪種解決方案,都需要服務(wù)提供者和客戶端兩種同時做改造。

form表單提交會發(fā)生跨域嗎?

我們的域名是 www.demo.com ,如下代碼會發(fā)生跨域嗎?

    <form action="http://baidu.com"  method="post" id="myForm">
        <input name="demo" id="demo" value="aaa"> 
        <input name="sign" id="sign" value="aaa"> 
        <button v-on:click="submitFile($event)">submit</button>
    </form>

這里既沒有獲取cookie、也沒有獲取dom、更沒有ajax調(diào)用,所以沒有跨域。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容