主頁 > 企業開發 > 跨域問題及其解決方法(JSONP&CORS)

跨域問題及其解決方法(JSONP&CORS)

2022-05-11 08:06:01 企業開發

一、什么是跨域

當a.qq.com域名下的頁?或腳本試圖去請求b.qq.com域名下的資源時,就是典型的跨域行為,跨域的定義從受限范圍可以分為兩種,?義跨域和狹義跨域,

 

 

(一)廣義跨域

?義跨域通常包含以下三種?為:
1. 資源跳轉:a鏈接、重定向,
2. 資源嵌?:<link>、<script>、<img>、<frame>等dom標簽,還有樣式中background:url()、@font-face()等?件外鏈,
3. 腳本請求:瀏覽器存盤資料讀取、dom和js物件的跨域操作、js發起的ajax請求等,
其中,資源跳轉和資源嵌??為可以正常請求到跨域資源,腳本請求在未經任何處理的情況下,通常會有跨域

(二)狹義跨域

狹義跨域正是瀏覽器同源策略限制的?類請求場景,即我們通常說的跨域?為,通常包含以下三種?為:
1. cookie、localStorage和indexDB?法讀取,
2. dom和js物件?法獲取和操作,
3. ajax請求?法發送


二、常見的跨域場景 

??瀏覽器安全的基石就是“同源策略”,即如果A網站設定的cookie,B網站如果想訪問必須滿足三個要求:同一種協議、同一個域名、同一個埠號,
??舉例來說,http://www.example.com/dir/page.html這個網址,協議是http://,域名是www.example.com,埠號是80(可以省略,http默認80,https默認443)
??例如:

  http://www.example.com/dir2/other.html :同源

  http://example.com/dir/other.html :不同源(域名不同)??

  http://v2.www.example.com/dir/other.html :不同源(域名不同

  http://www.example.com:81/dir/other.html :不同源(埠不同)

 

三、跨域解決方法

(一)ajax跨域請求解決方案

  1.jsonp跨域解決

jsonp (JSON with Padding),是JSON的?種“使?模式”,可以讓?頁跨域讀取資料,其本質是利?script標簽的開放策略,瀏覽器傳遞callback引數到后端,后端回傳資料時會將callback引數作為函式名來包裹資料,從?瀏覽器就可以跨域請求資料并定制函式來?動處理回傳資料,

  代碼示例:
var script = document.createElement('script');
script.type = 'text/javascript';
// 傳參callback給后端,后端回傳時執?這個在前端定義的回呼函式
script.src = https://www.cnblogs.com/wangguoxinyue/archive/2022/05/09/'http://a.qq.com/index.php?callback=handleCallback';
document.head.appendChild(script);
// 回呼執?函式
function handleCallback(res) {
alert(JSON.stringify(res));
}

 

 
  • jsonp跨域優點:

jsonp兼容性強,適?于所有瀏覽器,尤其是IE10及以下瀏覽器,

  • jsonp跨域缺點:

沒有關于調?錯誤的處理,
只?持GET請求,不?持POST請求以及?資料量的請求,?且也?法拿到相關的回傳頭,狀態碼等資料,
callback引數惡意注?,可能會造成xss漏洞,


  2.跨域資源共享(CORS) 

跨域資源共享(Cross-origin resource sharing,CORS)是?個 W3C標準,允許瀏覽器向跨域服務器發送請求,從?克服了ajax只能同源使?的限制,CORS需要瀏覽器和服務器同時?持,?前,所有主流瀏覽器(IE10及以上)使?XMLHttpRequest物件都可?持該功能,IE8和IE9需要使?XDomainRequest物件進?兼容,

CORS整個通信程序都是瀏覽器?動完成,瀏覽器?旦發現ajax請求跨源,就會?動在頭資訊中增加Origin欄位,?來說明本次請求來?哪個源(協議+域名+端?),因此,實作CORS通信的關鍵是服務器,需要服務器配置Access-Control-Allow-Origin頭資訊,當CORS請求需要攜帶cookie時,需要服務端配置Access-Control-Allow-Credentials頭資訊,前端也需要設定withCredentials,瀏覽器將CORS請求分成兩類:簡單請求和?簡單請求,簡單請求需要滿?以下兩?條件:

1. 請求?法是以下三種?法之?:HEAD、GET、POST,
2. HTTP的頭資訊不超出以下?種欄位:Accept、Accept-Language、Content-Language、Last-Event-ID、Content-Type:只限
于三個值application/x-www-form-urlencoded、multipart/form-data、text/plain,
CORS簡單請求跨域實作流程:

 



// IE8/9需?XDomainRequest兼容
var xhr = new XMLHttpRequest(); 
// 前端設定是否帶cookie
xhr.withCredentials = true;
xhr.open('post', 'http://a.qq.com/index.php', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send('user=saramliu');
xhr.onreadystatechange = function() {
    if (xhr.readyState == 4 && xhr.status == 200) {
        alert(xhr.responseText);
    }
};

 

  • CORS跨域優點:

?持所有型別的HTTP請求,功能完善,
通過onerror事件監聽進?調?錯誤處理;
通過Access-Control-Allow-Origin進?資源訪問授權,

  • CORS跨域缺點:

?前主流瀏覽器(IE10及以上)都?持CORS,但IE8和IE9需要使?XDomainRequest物件進?兼容,IE7及以下瀏覽器不?持

  3.服務器代理

服務器代理,顧名思義即在發送跨域請求時,后端進?代理中轉請求?服務器端,然后將獲取的資料回傳給前端,?般適?于以下場景:

針對IE7及以下瀏覽器摒棄Flash插件的情況,配置代理接?與前端頁?同源,并中轉?標服務器接?,則ajax請求不存在跨域問題,外?前端頁??法訪問內?接?,配置代理接?允許前端頁?訪問,并中轉內?接?,則外?前端頁?可以跨域訪問內?接?,

服務器代理實作流程:

 

  • 服務器代理優點:

在不使?Flash的情況下,兼容不?持CORS的瀏覽器跨域請求,

  • 服務器代理缺點:

后端需要?定的改造?作量,

(?)前端跨域通信解決?案

前端跨域通信是指瀏覽器中兩個不符合同源策略的前端頁?進?通信,

  1.document.domain+iframe

 

 

document.domain+iframe?案代碼?例:

<!-- A頁? http://a.qq.com/a.html -->
<iframe id="iframe" src="http://b.qq.com/b.html"></iframe>
<script>
document.domain = "qq.com";
var windowB = document.getElementById("iframe").contentWindow;
alert("B頁?的user變數:" + windowB.user);
</script>

<!-- B頁? http://b.qq.com/b.html --> <script> document.domain = "qq.com"; var user = "saramliu"; </script>

 

 

  • document.domain+iframe?案優點:

實作邏輯簡單,?需額外中轉頁?

  • document.domain+iframe?案缺點:

僅適?于主域相同,?域不同的前端通信跨域場景


  2.location.hash+iframe

當兩個不符合同源策略且主域不同的頁?需要進?跨域通信時,可以利?url的hash值改變但不重繪頁?的特性,實作簡單的前端跨域通信,

 

 

<!-- A頁? http://a.qq.com/a.html -->
<iframe id="iframe" src="http://b.qq1.com/b.html"></iframe>
<script>
    // 監聽c.html傳來的hash值
    window.onhashchange = function () {
        alert("B頁?傳遞資料:" + location.hash.substring(1));
    };
</script>
<!-- B頁? http://b.qq1.com/b.html -->
<iframe id="iframe" src="http://a.qq.com/c.html"></iframe>
<script>
    // 向c.html傳遞hash值
    var iframe = document.getElementById('iframe');
    setTimeout(function() {
        iframe.src = iframe.src + '#user=saramliu';
    }, 1000);
</script>
<!-- C頁? http://a.qq.com/c.html -->
<script>
    // 監聽b.html傳來的hash值
    window.onhashchange = function () {
        // 操作同域a.html的hash值,傳遞資料
        window.parent.parent.location.hash = window.location.hash.substring(1);
    };
</script>
  • location.hash+iframe?案優點

可以解決主域不同的前端通信跨域問題,
hash改變,頁?不會重繪,

  • location.hash+iframe?案缺點:

受部分瀏覽器安全機制限制,需要額外的同源中轉頁?,且中轉頁?需要js邏輯來修改hash值,
通信資料型別及長度均受限,且資料外顯在url上,存在?定安全風險,

  3.window.name+iframe

window.name屬性的獨特之處在于,name值在不同頁?(甚?不同域名)加載后依舊存在,并且可以?持?常長的name值(2MB),

window.name+iframe代碼?例:

<!-- A頁? http://a.qq.com/a.html -->
<iframe id="iframe" src="http://b.qq1.com/b.html"></iframe>
<script>
var state = 0;
var iframe = document.getElementById('iframe');
iframe.onload = function() {
if (state === 1) {
// 第2次onload成功后,讀取同域window.name中資料
alert(iframe.contentWindow.name);
} else if (state === 0) {
// 第1次onload成功后
state = 1;
}
};
</script>

<!-- B頁? http://b.qq1.com/b.html --> <script> window.name = "這?是B頁?!"; window.location = "http://a.qq.com/c.html"; </script>

 

  • window.name+iframe?案優點:

可以解決主域不同的前端通信跨域問題,
通信資料型別不受限,且長度可達2MB,

  • window.name+iframe?案缺點:

需要額外的同源中轉頁?,但中轉頁可以為空?頁,

  4.postMessage

postMessage是HTML5 XMLHttpRequest Level2中的API,且是為數不多可以跨域操作的window屬性之?,它通常?于解決以下??的問題:

1. 頁?和其打開的新窗?的資料傳遞,
2. 多窗?之間訊息傳遞,
3. 頁?與嵌套iframe訊息傳遞,

postMessage是?種安全的跨域通信?法,當a.html獲得對b.html的window物件后,a.html調?postMessage?法分發?個MessageEvent訊息,b.html通過監聽message事件即可獲取a.html傳遞的資料,從?實作跨域通信,

  • postMessage?法的語法如下:
otherWindow.postMessage(message、targetOrigin、[transfer])

 

otherWindow:?標窗?的window物件,?如iframe的contentWindow屬性、執?window.open回傳的window物件等,

message:將要發送給其他window的資料,

targetOrigin:指定哪些窗?能接收到訊息事件,其值可以是字串*(表??限制)或者是“協議+主機+端?號”,

transfer(可選):是?串和message同時傳遞的Transferable物件,這些物件的所有權將被轉移給訊息的接收?,?發送??將不再保有所有權,

postMessage?案代碼?例:

<!-- A頁? http://a.qq.com/a.html -->
<iframe id="iframe" src="http://b.qq1.com/b.html"></iframe>
<script>
    var iframe = document.getElementById('iframe');
    iframe.onload = function() {
        var data = {meesage: "這?是A頁?發的訊息"}; 
        var url = "http://b.qq1.com/b.html";
        // 向B頁?發送訊息
        iframe.contentWindow.postMessage(JSON.stringify(data), url);
    };
    window.addEventListener("message", function(e) {
        alert("B頁?發來訊息:" + JSON.parse(e.data));
    });
</script>

<!-- B頁? http://b.qq1.com/b.html --> <script> window.addEventListener("message", function(e) { alert("A頁?發來訊息:" + JSON.parse(e.data)); var data = {meesage: "這?是B頁?發的訊息"}; var url = "http://a.qq.com/a.html"; window.parent.postMessage(JSON.stringify(data), url); }, false); </script>

 

  • postMessage?案優點:

可以解決多種型別的前端跨域通信問題;

  • postMessage?案缺點:

兼容性??相對差?點,IE8及以下瀏覽器不?持該?法,IE9只?持postMessage傳遞string型別的資料,?標準的postMessage消
息資料可以是任何型別,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/472299.html

標籤:其他

上一篇:組件設計要求

下一篇:從URL輸入到頁面展現到底發生什么?DNS 決議&TCP 連接

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more