溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Web前端的跨域方式是怎樣的

發(fā)布時間:2021-11-10 10:37:59 來源:億速云 閱讀:138 作者:iii 欄目:web開發(fā)

本篇內(nèi)容主要講解“Web前端的跨域方式是怎樣的”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Web前端的跨域方式是怎樣的”吧!

什么是跨域 

Web前端的跨域方式是怎樣的

JavaScript出于安全方面的考慮,不允許跨域調(diào)用其他頁面的對象。那什么是跨域呢,簡單地理解就是因為JavaScript同源策略的限制,a.com域名下的js無法操作b.com或是c.a.com域名下的對象。

當(dāng)協(xié)議、子域名、主域名、端口號中任意一個不相同時,都算作不同域。不同域之間相互請求資源,就算作“跨域”。

有一點必須要注意:跨域并不是請求發(fā)不出去,請求能發(fā)出去,服務(wù)端能收到請求并正常返回結(jié)果,只是結(jié)果被瀏覽器攔截了。之所以會跨域,是因為受到了同源策略的限制,同源策略要求源相同才能正常進(jìn)行通信,即協(xié)議、域名、端口號都完全一致。

大家可以參照下圖,有助于深入理解跨域。

Web前端的跨域方式是怎樣的

特別說明兩點:

***:如果是協(xié)議和端口造成的跨域問題“前臺”是無能為力的。

第二:在跨域問題上,域僅僅是通過“URL的首部”來識別而不會根據(jù)域名對應(yīng)的IP地址是否相同來判斷?!癠RL的首部”可以理解為“協(xié)議, 域名和端口必須匹配”。

什么是同源策略及其限制

同源策略限制從一個源加載的文檔或腳本如何與來自另一個源的資源進(jìn)行交互。這是一個用于隔離潛在惡意文件的關(guān)鍵的安全機(jī)制。它的存在可以保護(hù)用戶隱私信息,防止身份偽造等(讀取Cookie)。

同源策略限制內(nèi)容有:

Cookie、LocalStorage、IndexedDB 等存儲性內(nèi)容

DOM 節(jié)點

AJAX 請求不能發(fā)送

但是有三個標(biāo)簽是允許跨域加載資源:

Web前端的跨域方式是怎樣的

接下來我們討論下有哪些處理跨域的方法。但所有的跨域都必須經(jīng)過信息提供方的允許。如果未經(jīng)允許即可獲取,那是瀏覽器同源策略出現(xiàn)漏洞。

處理跨域方法一——JSONP

1.JSONP原理

利用<script>元素的這個開放策略,網(wǎng)頁可以得到從其他來源動態(tài)產(chǎn)生的 JSON 數(shù)據(jù)。JSONP請求一定需要對方的服務(wù)器做支持才可以。

2.JSONP和AJAX對比

JSONP和AJAX相同,都是客戶端向服務(wù)器端發(fā)送請求,從服務(wù)器端獲取數(shù)據(jù)的方式。但AJAX屬于同源策略,JSONP屬于非同源策略(跨域請求)

3.JSONP優(yōu)缺點

JSONP優(yōu)點是兼容性好,可用于解決主流瀏覽器的跨域數(shù)據(jù)訪問的問題。缺點是僅支持get方法具有局限性。

4.JSONP的流程(以第三方API地址為例,不必考慮后臺程序)

聲明一個回調(diào)函數(shù),其函數(shù)名(如fn)當(dāng)做參數(shù)值,要傳遞給跨域請求數(shù)據(jù)的服務(wù)器,函數(shù)形參為要獲取目標(biāo)數(shù)據(jù)(服務(wù)器返回的data)。

創(chuàng)建一個<script>標(biāo)簽,把那個跨域的API數(shù)據(jù)接口地址,賦值給script的src,還要在這個地址中向服務(wù)器傳遞該函數(shù)名(可以通過問號傳參:?callback=fn)。

服務(wù)器接收到請求后,需要進(jìn)行特殊的處理:把傳遞進(jìn)來的函數(shù)名和它需要給你的數(shù)據(jù)拼接成一個字符串,例如:傳遞進(jìn)去的函數(shù)名是fn,它準(zhǔn)備好的數(shù)據(jù)是fn([{"name":"jianshu"}])。

***服務(wù)器把準(zhǔn)備的數(shù)據(jù)通過HTTP協(xié)議返回給客戶端,客戶端再調(diào)用執(zhí)行之前聲明的回調(diào)函數(shù)(fn),對返回的數(shù)據(jù)進(jìn)行操作。

Web前端的跨域方式是怎樣的

其中 fn 是客戶端注冊的回調(diào)的函數(shù),目的獲取跨域服務(wù)器上的json數(shù)據(jù)后,對數(shù)據(jù)進(jìn)行在處理。

***服務(wù)器返回給客戶端數(shù)據(jù)的格式為:

Web前端的跨域方式是怎樣的

5.jQuery的jsonp形式

JSONP都是GET和異步請求的,不存在其他的請求方式和同步請求,且jQuery默認(rèn)就會給JSONP的請求清除緩存。

Web前端的跨域方式是怎樣的

處理跨域方法二&mdash;&mdash;CORS

1.CORS原理

整個CORS通信過程,都是瀏覽器自動完成,不需要用戶參與。對于開發(fā)者來說,CORS通信與同源的AJAX通信沒有差別,代碼完全一樣。瀏覽器一旦發(fā)現(xiàn)AJAX請求跨源,就會自動添加一些附加的頭信息,有時還會多出一次附加的請求,但用戶不會有感覺。因此,實現(xiàn)CORS通信的關(guān)鍵是服務(wù)器。只要服務(wù)器實現(xiàn)了CORS接口,就可以跨源通信。

2.CORS優(yōu)缺點

CORS要求瀏覽器(>IE10)和服務(wù)器的同時支持,是跨域的根本解決方法,由瀏覽器自動完成。

優(yōu)點在于功能更加強(qiáng)大支持各種HTTP Method,缺點是兼容性不如JSONP。

只需要在服務(wù)器端做一些小小的改造即可:

Web前端的跨域方式是怎樣的

例如:網(wǎng)站http://localhost:{{63342:0}}/ 頁面要請求http://localhost:3000/users/userlist 頁面,userlist頁面返回json字符串格{name: 'Mr.Cao', gender: 'male', career: 'IT Education'}

Web前端的跨域方式是怎樣的

在響應(yīng)頭上添加Access-Control-Allow-Origin屬性,指定同源策略的地址。同源策略默認(rèn)地址是網(wǎng)頁的本身。只要瀏覽器檢測到響應(yīng)頭帶上了CORS,并且允許的源包括了本網(wǎng)站,那么就不會攔截請求響應(yīng)。

Web前端的跨域方式是怎樣的

處理跨域方法三&mdash;&mdash;WebSocket

Websocket是HTML5的一個持久化的協(xié)議,它實現(xiàn)了瀏覽器與服務(wù)器的全雙工通信,同時也是跨域的一種解決方案。WebSocket和HTTP都是應(yīng)用層協(xié)議,都基于 TCP 協(xié)議。但是 WebSocket 是一種雙向通信協(xié)議,在建立連接之后,WebSocket 的 server 與 client 都能主動向?qū)Ψ桨l(fā)送或接收數(shù)據(jù)。同時,WebSocket 在建立連接時需要借助 HTTP 協(xié)議,連接建立好了之后 client 與 server 之間的雙向通信就與 HTTP 無關(guān)了。

原生WebSocket API使用起來不太方便,我們使用Socket.io,它很好地封裝了webSocket接口,提供了更簡單、靈活的接口,也對不支持webSocket的瀏覽器提供了向下兼容。

Web前端的跨域方式是怎樣的

Web前端的跨域方式是怎樣的

處理跨域方法四&mdash;&mdash;postMessage

如果兩個網(wǎng)頁不同源,就無法拿到對方的DOM。典型的例子是iframe窗口和window.open方法打開的窗口,它們與父窗口無法通信。HTML5為了解決這個問題,引入了一個全新的API:跨文檔通信 API(Cross-document messaging)。這個API為window對象新增了一個window.postMessage方法,允許跨窗口通信,不論這兩個窗口是否同源。postMessage方法的***個參數(shù)是具體的信息內(nèi)容,第二個參數(shù)是接收消息的窗口的源(origin),即"協(xié)議 + 域名 + 端口"。也可以設(shè)為*,表示不限制域名,向所有窗口發(fā)送。

接下來我們看個例子:

Web前端的跨域方式是怎樣的

Web前端的跨域方式是怎樣的

到此,相信大家對“Web前端的跨域方式是怎樣的”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI