成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

分享JavaScript的跨域共享的方法

開發(fā) 前端
本文介紹的是javascript的跨域共享的方法,希望對你有幫助,一起來看。

在客戶端編程語言中,如javascript和ActionScript,同源策略是一個(gè)很重要的安全理念,它在保證數(shù)據(jù)的安全性方面有著重要的意義。同源策略規(guī)定跨域之間的腳本是隔離的,一個(gè)域的腳本不能訪問和操作另外一個(gè)域的絕大部分屬性和方法。那么什么叫相同域,什么叫不同的域呢?

同源策略

在客戶端編程語言中,如javascript和ActionScript,同源策略是一個(gè)很重要的安全理念,它在保證數(shù)據(jù)的安全性方面有著重要的意義。

同源策略規(guī)定跨域之間的腳本是隔離的,一個(gè)域的腳本不能訪問和操作另外一個(gè)域的絕大部分屬性和方法。那么什么叫相同域,什么叫不同的域呢?當(dāng)兩個(gè)域具有相同的協(xié)議(如http),相同的端口(如80),相同的host(如www.example.org),那么我們就可以認(rèn)為它們是相同的域。

比如http://www.example.org/index.html和http://www.example.org/sub/index.html是同域,而http://www.example.org,https://www.example.org,http://www.example.org:8080,http://sub.example.org中的任何兩個(gè)都將構(gòu)成跨域。同源策略還應(yīng)該對一些特殊情況做處理,比如限制file協(xié)議下腳本的訪問權(quán)限。本地的HTML文件在瀏覽器中是通過file協(xié)議打開的,如果腳本能通過file協(xié)議訪問到硬盤上其它任意文件,就會(huì)出現(xiàn)安全隱患,目前IE8還有這樣的隱患。

受到同源策略的影響,跨域資源共享就會(huì)受到制約。但是隨著人們的實(shí)踐和瀏覽器的進(jìn)步,目前在跨域請求的技巧上,有很多寶貴經(jīng)驗(yàn)的沉淀和積累。這里我把跨域資源共享分成兩種,一種是單向的數(shù)據(jù)請求,還有一種是雙向的消息通信。接下來我將羅列出常見的一些跨域方式,以下跨域?qū)嵗脑创a可以從這里獲得。

單向跨域

JSONP(JSONwithPadding)是一個(gè)簡單高效的跨域方式,HTML中的script標(biāo)簽可以加載并執(zhí)行其他域的javascript,于是我們可以通過script標(biāo)記來動(dòng)態(tài)加載其他域的資源。

例如我要從域A的頁面pageA加載域B的數(shù)據(jù),那么在域B的頁面pageB中我以JavaScript的形式聲明pageA需要的數(shù)據(jù),然后在pageA中用script標(biāo)簽把pageB加載進(jìn)來,那么pageB中的腳本就會(huì)得以執(zhí)行。JSONP在此基礎(chǔ)上加入了回調(diào)函數(shù),pageB加載完之后會(huì)執(zhí)行pageA中定義的函數(shù),所需要的數(shù)據(jù)會(huì)以參數(shù)的形式傳遞給該函數(shù)。

JSONP易于實(shí)現(xiàn),但是也會(huì)存在一些安全隱患,如果第三方的腳本隨意地執(zhí)行,那么它就可以篡改頁面內(nèi)容,截獲敏感數(shù)據(jù)。但是在受信任的雙方傳遞數(shù)據(jù),JSONP是非常合適的選擇。

flash有自己的一套安全策略,服務(wù)器可以通過crossdomain.xml文件來聲明能被哪些域的SWF文件訪問,SWF也可以通過API來確定自身能被哪些域的SWF加載。當(dāng)跨域訪問資源時(shí),例如從域www.a.com請求域www.b.com上的數(shù)據(jù),我們可以借助flash來發(fā)送HTTP請求。

首先,修改域www.b.com上的crossdomain.xml(一般存放在根目錄,如果沒有需要手動(dòng)創(chuàng)建),把www.a.com加入到白名單。

其次,通過FlashURLLoader發(fā)送HTTP請求。

***,通過FlashAPI把響應(yīng)結(jié)果傳遞給JavaScript。FlashURLLoader是一種很普遍的跨域解決方案,不過需要支持iOS的話,這個(gè)方案就無能為力了。

window對象的name屬性是一個(gè)很特別的屬性,當(dāng)該window的location變化,然后重新加載,它的name屬性可以依然保持不變。那么我們可以在頁面A中用iframe加載其他域的頁面B,而頁面B中用JavaScript把需要傳遞的數(shù)據(jù)賦值給window.name,iframe加載完成之后,頁面A修改iframe的地址,將其變成同域的一個(gè)地址,然后就可以讀出window.name的值了。這個(gè)方式非常適合單向的數(shù)據(jù)請求,而且協(xié)議簡單、安全。不會(huì)像JSONP那樣不做限制地執(zhí)行外部腳本。

在數(shù)據(jù)提供方?jīng)]有提供對JSONP協(xié)議或者window.name協(xié)議的支持,也沒有對其它域開放訪問權(quán)限時(shí),我們可以通過serverproxy的方式來抓取數(shù)據(jù)。例如當(dāng)www.a.com域下的頁面需要請求www.b.com下的資源文件asset.txt時(shí),直接發(fā)送一個(gè)指向www.b.com/asset.txt的Ajax請求肯定是會(huì)被瀏覽器阻止。

這時(shí),我們在www.a.com下配一個(gè)代理,然后把Ajax請求綁定到這個(gè)代理路徑下,例如www.a.com/proxy/,然后這個(gè)代理發(fā)送HTTP請求訪問www.b.com下的asset.txt,跨域的HTTP請求是在服務(wù)器端進(jìn)行的,客戶端并沒有產(chǎn)生跨域的Ajax請求。這個(gè)跨域方式不需要和目標(biāo)資源簽訂協(xié)議,帶有侵略性,另外需要注意的是實(shí)踐中應(yīng)該對這個(gè)代理實(shí)施一定程度的保護(hù),比如限制他人使用或者使用頻率。

雙向跨域

通過修改document的domain屬性,我們可以在域和子域或者不同的子域之間通信。同域策略認(rèn)為域和子域隸屬于不同的域,比如www.a.com和sub.a.com是不同的域,這時(shí),我們無法在www.a.com下的頁面中調(diào)用sub.a.com中定義的JavaScript方法。但是當(dāng)我們把它們document的domain屬性都修改為a.com,瀏覽器就會(huì)認(rèn)為它們處于同一個(gè)域下,那么我們就可以互相調(diào)用對方的method來通信了。

不同的域之間,JavaScript只能做很有限的訪問和操作,其實(shí)我們利用這些有限的訪問權(quán)限就可以達(dá)到跨域通信的目的了。FIM(FragmentIdentitierMessaging)就是在這個(gè)大前提下被發(fā)明的。父窗口可以對iframe進(jìn)行URL讀寫,iframe也可以讀寫父窗口的URL,URL有一部分被稱為frag,就是#號及其后面的字符,它一般用于瀏覽器錨點(diǎn)定位,Server端并不關(guān)心這部分,應(yīng)該說HTTP請求過程中不會(huì)攜帶frag,所以這部分的修改不會(huì)產(chǎn)生HTTP請求,但是會(huì)產(chǎn)生瀏覽器歷史記錄。

FIM的原理就是改變URL的frag部分來進(jìn)行雙向通信。每個(gè)window通過改變其他window的location來發(fā)送消息,并通過監(jiān)聽自己的URL的變化來接收消息。這個(gè)方式的通信會(huì)造成一些不必要的瀏覽器歷史記錄,而且有些瀏覽器不支持onhashchange事件,需要輪詢來獲知URL的改變,***,URL在瀏覽器下有長度限制,這個(gè)制約了每次傳送的數(shù)據(jù)量。

頁面上的雙向通信也可以通過Flash來解決,F(xiàn)lashAPI中有LocalConnection這個(gè)類,該類允許兩個(gè)SWF之間通過進(jìn)程通信,這時(shí)SWF可以播放在獨(dú)立的FlashPlayer或者AIR中,也可以嵌在HTML頁面或者是PDF中。遵循這個(gè)通信原則,我們可以在不同域的HTML頁面各自嵌套一個(gè)SWF來達(dá)到相互傳遞數(shù)據(jù)的目的了。

SWF通過LocalConnection交換數(shù)據(jù)是很快的,但是每次的數(shù)據(jù)量有40kb的大小限制。用這種方式來跨域通信過于復(fù)雜,而且需要了2個(gè)SWF文件,實(shí)用性不強(qiáng)。

window.postMessage是HTML5定義的一個(gè)很新的方法,這個(gè)方法可以很方便地跨window通信。由于它是一個(gè)很新的方法,所以在很舊和比較舊的瀏覽器中都無法使用。

JAVASCRIPT總結(jié)

跨域的方法很多,不同的應(yīng)用場景我們都可以找到一個(gè)最合適的解決方案。比如單向的數(shù)據(jù)請求,我們應(yīng)該優(yōu)先選擇JSONP或者window.name,雙向通信我們采取CrossFrame,在未與數(shù)據(jù)提供方?jīng)]有達(dá)成通信協(xié)議的情況下我們也可以用serverproxy的方式來抓取數(shù)據(jù)。

希望通過本文的介紹,能夠給你帶來幫助。

【編輯推薦】

  1. 快速排序(Quicksort)的Javascript實(shí)現(xiàn)
  2. 用Javascript獲取頁面元素的位置
  3. 論Javascript的類繼承
  4. Javascript中的函數(shù)聲明和函數(shù)表達(dá)式
  5. Javascript閉包(closure) 深入淺出
責(zé)任編輯:于鐵 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2011-04-08 09:16:12

JavaScript

2021-06-15 07:32:59

Cookie和Sess實(shí)現(xiàn)跨域

2021-04-27 15:20:41

人工智能機(jī)器學(xué)習(xí)技術(shù)

2019-03-13 14:15:25

CORS跨域資源前端

2011-07-08 09:07:11

JavaScript

2017-03-12 19:51:38

js實(shí)用跨域

2020-12-20 18:00:04

跨域請求開發(fā)CORS

2011-02-22 17:14:20

2013-11-27 10:23:23

2024-05-20 09:28:44

Spring客戶端瀏覽器

2017-08-22 15:58:56

2011-11-07 11:15:31

2021-03-09 08:50:58

JavaScript前端作用域

2009-02-18 09:30:10

AJAX跨域XML

2023-05-06 15:32:04

2018-11-26 14:52:12

Web前端跨域

2013-07-11 10:08:05

2024-08-28 08:45:22

2016-11-01 21:51:03

phpjavascript

2019-04-10 10:32:16

CORSNginx反向代理
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 99久久久久久| 欧美久久国产精品 | 精品免费国产视频 | 亚洲伊人久久综合 | 日本免费在线 | 亚洲人成在线播放 | 欧美激情欧美激情在线五月 | 国产国拍亚洲精品av | 国产精品www | 国产成人一区二区三区久久久 | 精品在线免费观看视频 | 欧美一二区 | 日本不卡在线视频 | 一级片免费网站 | www国产亚洲精品久久网站 | 国产伦精品一区二区三毛 | 欧美一区二区在线 | 精品欧美黑人一区二区三区 | 亚洲精品久久久 | 久草综合在线视频 | 日本成人片在线观看 | 成人国产精品视频 | 久久亚洲一区 | 中文字幕在线人 | 国产一伦一伦一伦 | 91在线视频在线观看 | 日韩一区二区精品 | 国产乱肥老妇国产一区二 | 欧美精品一区二区三区在线 | 日韩在线播放视频 | 日韩精品一区二区三区四区视频 | 一级a性色生活片久久毛片 一级特黄a大片 | 羞羞涩涩在线观看 | 好姑娘高清在线观看电影 | 中文字幕国产第一页 | 91精品国产乱码久久久 | 国产精品久久久久久亚洲调教 | 一区二区三区免费 | 黄a网| 99精品视频在线观看免费播放 | 97人人澡人人爽91综合色 |