摘要:方法會(huì)自動(dòng)判斷是否跨域,不跨域的話,就調(diào)用普通的方法跨域的話,則會(huì)以異步加載文件的形式來(lái)調(diào)用的回調(diào)函數(shù)。通過(guò)修改來(lái)跨子域?yàn)g覽器都有一個(gè)同源策略,其限制之一就是第一種方法中我們說(shuō)的不能通過(guò)的方法去請(qǐng)求不同源中的文檔。
什么是跨域?
概念:只要協(xié)議、域名、端口有任何一個(gè)不同,都被當(dāng)作是不同的域。
URL 說(shuō)明 是否允許通信 http://www.a.com/a.js http://www.a.com/b.js 同一域名下 允許 http://www.a.com/lab/a.js http://www.a.com/script/b.js 同一域名下不同文件夾 允許 http://www.a.com:8000/a.js http://www.a.com/b.js 同一域名,不同端口 不允許 http://www.a.com/a.js https://www.a.com/b.js 同一域名,不同協(xié)議 不允許 http://www.a.com/a.js http://70.32.92.74/b.js 域名和域名對(duì)應(yīng)ip 不允許 http://www.a.com/a.js http://script.a.com/b.js 主域相同,子域不同 不允許 http://www.a.com/a.js http://a.com/b.js 同一域名,不同二級(jí)域名(同上) 不允許(cookie這種情況下也不允許訪問(wèn)) http://www.cnblogs.com/a.js http://www.a.com/b.js 不同域名 不允許
對(duì)于端口和協(xié)議的不同,只能通過(guò)后臺(tái)來(lái)解決。
跨域資源共享(CORS)CORS(Cross-Origin Resource Sharing)跨域資源共享,定義了必須在訪問(wèn)跨域資源時(shí),瀏覽器與服務(wù)器應(yīng)該如何溝通。CORS背后的基本思想就是使用自定義的HTTP頭部讓瀏覽器與服務(wù)器進(jìn)行溝通,從而決定請(qǐng)求或響應(yīng)是應(yīng)該成功還是失敗。
以上的trigkit4是相對(duì)路徑,如果我們要使用CORS,相關(guān)Ajax代碼可能如下所示:
代碼與之前的區(qū)別就在于相對(duì)路徑換成了其他域的絕對(duì)路徑,也就是你要跨域訪問(wèn)的接口地址。
服務(wù)器端對(duì)于CORS的支持,主要就是通過(guò)設(shè)置Access-Control-Allow-Origin來(lái)進(jìn)行的。如果瀏覽器檢測(cè)到相應(yīng)的設(shè)置,就可以允許Ajax進(jìn)行跨域的訪問(wèn)。
要解決跨域的問(wèn)題,我們可以使用以下幾種方法:
通過(guò)jsonp跨域現(xiàn)在問(wèn)題來(lái)了?什么是jsonp?維基百科的定義是:JSONP(JSON with Padding)是資料格式 JSON 的一種“使用模式”,可以讓網(wǎng)頁(yè)從別的網(wǎng)域要資料。
JSONP也叫填充式JSON,是應(yīng)用JSON的一種新方法,只不過(guò)是被包含在函數(shù)調(diào)用中的JSON,例如:
callback({"name","trigkit4"});
JSONP由兩部分組成:回調(diào)函數(shù)和數(shù)據(jù)?;卣{(diào)函數(shù)是當(dāng)響應(yīng)到來(lái)時(shí)應(yīng)該在頁(yè)面中調(diào)用的函數(shù),而數(shù)據(jù)就是傳入回調(diào)函數(shù)中的JSON數(shù)據(jù)。
在js中,我們直接用XMLHttpRequest請(qǐng)求不同域上的數(shù)據(jù)時(shí),是不可以的。但是,在頁(yè)面上引入不同域上的js腳本文件卻是可以的,jsonp正是利用這個(gè)特性來(lái)實(shí)現(xiàn)的。 例如:
js文件載入成功后會(huì)執(zhí)行我們?cè)趗rl參數(shù)中指定的函數(shù),并且會(huì)把我們需要的json數(shù)據(jù)作為參數(shù)傳入。所以jsonp是需要服務(wù)器端的頁(yè)面進(jìn)行相應(yīng)的配合的。
最終,輸出結(jié)果為:dosomething(["a","b","c"]);
如果你的頁(yè)面使用jquery,那么通過(guò)它封裝的方法就能很方便的來(lái)進(jìn)行jsonp操作了。
jquery會(huì)自動(dòng)生成一個(gè)全局函數(shù)來(lái)替換callback=?中的問(wèn)號(hào),之后獲取到數(shù)據(jù)后又會(huì)自動(dòng)銷毀,實(shí)際上就是起一個(gè)臨時(shí)代理函數(shù)的作用。$.getJSON方法會(huì)自動(dòng)判斷是否跨域,不跨域的話,就調(diào)用普通的ajax方法;跨域的話,則會(huì)以異步加載js文件的形式來(lái)調(diào)用jsonp的回調(diào)函數(shù)。
JSONP的優(yōu)缺點(diǎn)JSONP的優(yōu)點(diǎn)是:它不像XMLHttpRequest對(duì)象實(shí)現(xiàn)的Ajax請(qǐng)求那樣受到同源策略的限制;它的兼容性更好,在更加古老的瀏覽器中都可以運(yùn)行,不需要XMLHttpRequest或ActiveX的支持;并且在請(qǐng)求完畢后可以通過(guò)調(diào)用callback的方式回傳結(jié)果。
JSONP的缺點(diǎn)則是:它只支持GET請(qǐng)求而不支持POST等其它類型的HTTP請(qǐng)求;它只支持跨域HTTP請(qǐng)求這種情況,不能解決不同域的兩個(gè)頁(yè)面之間如何進(jìn)行JavaScript調(diào)用的問(wèn)題。
CORS和JSONP對(duì)比CORS與JSONP相比,無(wú)疑更為先進(jìn)、方便和可靠。
1、 JSONP只能實(shí)現(xiàn)GET請(qǐng)求,而CORS支持所有類型的HTTP請(qǐng)求。 2、 使用CORS,開(kāi)發(fā)者可以使用普通的XMLHttpRequest發(fā)起請(qǐng)求和獲得數(shù)據(jù),比起JSONP有更好的錯(cuò)誤處理。 3、 JSONP主要被老的瀏覽器支持,它們往往不支持CORS,而絕大多數(shù)現(xiàn)代瀏覽器都已經(jīng)支持了CORS)。通過(guò)修改document.domain來(lái)跨子域
瀏覽器都有一個(gè)同源策略,其限制之一就是第一種方法中我們說(shuō)的不能通過(guò)ajax的方法去請(qǐng)求不同源中的文檔。 它的第二個(gè)限制是瀏覽器中不同域的框架之間是不能進(jìn)行js的交互操作的。
不同的框架之間是可以獲取window對(duì)象的,但卻無(wú)法獲取相應(yīng)的屬性和方法。比如,有一個(gè)頁(yè)面,它的地址是http://www.example.com/a.html , 在這個(gè)頁(yè)面里面有一個(gè)iframe,它的src是http://example.com/b.html, 很顯然,這個(gè)頁(yè)面與它里面的iframe框架是不同域的,所以我們是無(wú)法通過(guò)在頁(yè)面中書(shū)寫(xiě)js代碼來(lái)獲取iframe中的東西的:
這個(gè)時(shí)候,document.domain就可以派上用場(chǎng)了,我們只要把http://www.example.com/a.html 和 http://example.com/b.html這兩個(gè)頁(yè)面的document.domain都設(shè)成相同的域名就可以了。但要注意的是,document.domain的設(shè)置是有限制的,我們只能把document.domain設(shè)置成自身或更高一級(jí)的父域,且主域必須相同。
1.在頁(yè)面 http://www.example.com/a.html 中設(shè)置document.domain:
2.在頁(yè)面 http://example.com/b.html 中也設(shè)置document.domain:
修改document.domain的方法只適用于不同子域的框架間的交互。
使用window.name來(lái)進(jìn)行跨域window對(duì)象有個(gè)name屬性,該屬性有個(gè)特征:即在一個(gè)窗口(window)的生命周期內(nèi),窗口載入的所有的頁(yè)面都是共享一個(gè)window.name的,每個(gè)頁(yè)面對(duì)window.name都有讀寫(xiě)的權(quán)限,window.name是持久存在一個(gè)窗口載入過(guò)的所有頁(yè)面中的
使用HTML5的window.postMessage方法跨域window.postMessage(message,targetOrigin) 方法是html5新引進(jìn)的特性,可以使用它來(lái)向其它的window對(duì)象發(fā)送消息,無(wú)論這個(gè)window對(duì)象是屬于同源或不同源,目前IE8+、FireFox、Chrome、Opera等瀏覽器都已經(jīng)支持window.postMessage方法。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/85338.html
摘要:之前我們講了一下四種跨域的方式四種跨域方式詳解。這四種方式是使用純來(lái)進(jìn)行跨域的。今天就介紹兩種有涉及到服務(wù)器的跨域技術(shù)。 之前我們講了一下四種 JavaScript 跨域的方式 - 「JavaScript」四種跨域方式詳解。這四種方式是使用純 JavaScript 來(lái)進(jìn)行跨域的。 今天就介紹兩種有涉及到服務(wù)器的跨域技術(shù)。 一、反向代理服務(wù)器 基礎(chǔ)思想很簡(jiǎn)單,將你的服務(wù)器配置成 需要跨域...
摘要:超詳細(xì)并且?guī)У目缬蛑改蟻?lái)了本文基于你了解的同源策略,并且了解使用跨域跨域的理由。使用方法就是將符合上述條件頁(yè)面的設(shè)置為同樣的二級(jí)域名。這兩個(gè)網(wǎng)站都是協(xié)議,端口都是,且二級(jí)域名都是。 超詳細(xì)并且?guī)?Demo 的 JavaScript 跨域指南來(lái)了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由。 1. JSONP 首先要介紹的跨域方法必然是 JSONP。 ...
跨域 要知道在請(qǐng)求后臺(tái)接口遇到Access-Control-Allow-Origin時(shí),這就表明跨域了?! ∈紫冉忉尶缬?,是因?yàn)闉g覽器的同源策略所導(dǎo)致,同源策略(Same origin policy)是一種約定,它是瀏覽器最核心也最基本的安全功能,同源是指:域名、協(xié)議、端口相同 解決跨域常用方法: 一、VUE中常用proxy來(lái)解決跨域問(wèn)題 1、在vue.config.js中設(shè)置如下代碼...
摘要:只有兩種數(shù)據(jù)類型描述符,大括號(hào)和方括號(hào),其余英文冒號(hào)是映射符,英文逗號(hào)是分隔符,英文雙引號(hào)是定義符。上述兩種集合中若有多個(gè)子項(xiàng),則通過(guò)英文逗號(hào)進(jìn)行分隔。鍵值對(duì)以英文冒號(hào)進(jìn)行分隔,并且建議鍵名都加上英文雙引號(hào),以便于不同語(yǔ)言的解析。 由于Sencha Touch 2這種開(kāi)發(fā)模式的特性,基本決定了它原生的數(shù)據(jù)交互行為幾乎只能通過(guò)AJAX來(lái)實(shí)現(xiàn)。當(dāng)然了,通過(guò)調(diào)用強(qiáng)大的PhoneGap插件然后...
摘要:只有兩種數(shù)據(jù)類型描述符,大括號(hào)和方括號(hào),其余英文冒號(hào)是映射符,英文逗號(hào)是分隔符,英文雙引號(hào)是定義符。上述兩種集合中若有多個(gè)子項(xiàng),則通過(guò)英文逗號(hào)進(jìn)行分隔。鍵值對(duì)以英文冒號(hào)進(jìn)行分隔,并且建議鍵名都加上英文雙引號(hào),以便于不同語(yǔ)言的解析。 由于Sencha Touch 2這種開(kāi)發(fā)模式的特性,基本決定了它原生的數(shù)據(jù)交互行為幾乎只能通過(guò)AJAX來(lái)實(shí)現(xiàn)。當(dāng)然了,通過(guò)調(diào)用強(qiáng)大的PhoneGap插件然后...
閱讀 3005·2023-04-26 02:22
閱讀 2349·2021-11-17 09:33
閱讀 3247·2021-09-22 16:06
閱讀 1159·2021-09-22 15:54
閱讀 3596·2019-08-29 13:44
閱讀 2020·2019-08-29 12:37
閱讀 1372·2019-08-26 14:04
閱讀 1976·2019-08-26 11:57