同源策略&跨域

同源策略&跨域

同源策略

對于同源的定義最欠,MDN給出了這樣的解釋:如果兩個(gè)頁面的協(xié)議欺旧,端口(如果有指定)和主機(jī)都相同,則兩個(gè)頁面具有相同的源懈万。

如何確定兩個(gè)頁面是否同源,只要比較兩個(gè)頁面的協(xié)議靶病、域名和端口即可会通。

假設(shè)有這樣一個(gè)頁面http://zhihu.com/main.html,相對于它給出同源檢測的示例:

URL 結(jié)果 原因
http://zhihu.com/other.html 成功 只有路徑不同
http://zhihu.com/a/another.html 成功 只有路徑不同
https://zhihu.com/page.js 失敗 不同協(xié)議(https和hhtp)
http://zhihu.com:81/a.html 失敗 不同端口 ( http:// 80是默認(rèn)的)
http://news.com/b.html 失敗 不同域名 ( news和zhihu )

同源策略是瀏覽器最核心也最基本的安全功能娄周。保證用戶信息的安全涕侈,防止惡意的網(wǎng)站竊取數(shù)據(jù)。限制了從同一個(gè)源加載的文檔或腳本如何與來自另一個(gè)源的資源進(jìn)行交互煤辨。這是一個(gè)用于隔離潛在惡意文件的重要安全機(jī)制裳涛。

協(xié)議、端口众辨、域名只要有一個(gè)不相同调违,就不符合同源策略,就會出現(xiàn)跨域泻轰。最常見的就是AJAX請求數(shù)據(jù)技肩。

跨域的解決辦法

一、JSONP
JSONP是如何產(chǎn)生的呢浮声?

1.我們都知道使用AJAX直接請求普通文件存在跨域無權(quán)限訪問的問題虚婿,甭管你是什么,只要你是跨域請求泳挥,一律不準(zhǔn)不可以的然痊;

2.但是我們知道HTML中的<script><img><iframe>等標(biāo)簽不受同源策略的影響,擁有跨域的能力屉符。那我們是否能利用這個(gè)特性從其他域下獲取數(shù)據(jù)呢

3.我們得出結(jié)論剧浸,要想在web端就跨域訪問其他域的數(shù)據(jù)就有一個(gè)辦法,那就是把數(shù)據(jù)裝進(jìn) JS 格式的文件里矗钟,這樣客戶端就能夠調(diào)用了唆香。

4.但是獲取的數(shù)據(jù)是做為 JS 來執(zhí)行。于是就有一個(gè)問題吨艇,數(shù)據(jù)是 JSON 格式的數(shù)據(jù)躬它,直接作為 JS 運(yùn)行的話我如何去得到這個(gè)數(shù)據(jù)來操作呢?

5.于是我們想到是否可以提前在頁面上聲明一個(gè)函數(shù)东涡,通過接口傳參的方式發(fā)送給后臺冯吓,在經(jīng)過后臺處理發(fā)送給前端(所以JSONP 需要對應(yīng)接口的后端的配合才能實(shí)現(xiàn)倘待。)

示例
<script src="http://api.jirengu.com/weather.php?callback=showData"></script>

這個(gè)請求到達(dá)后端后,后端會去解析callback這個(gè)參數(shù)獲取到字符串showData组贺,在發(fā)送數(shù)據(jù)做如下處理:

之前后端返回?cái)?shù)據(jù): {"city": "hangzhou", "weather": "晴天"} 現(xiàn)在后端返回?cái)?shù)據(jù): showData({"city": "hangzhou", "weather": "晴天"}) 前端script標(biāo)簽在加載數(shù)據(jù)后會把 「showData({“city”: “hangzhou”, “weather”: “晴天”})」做為 js 來執(zhí)行凸舵,這實(shí)際上就是調(diào)用showData這個(gè)函數(shù),同時(shí)參數(shù)是 {“city”: “hangzhou”, “weather”: “晴天”}失尖。 用戶只需要在加載提前在頁面定義好showData這個(gè)全局函數(shù)啊奄,在函數(shù)內(nèi)部處理參數(shù)即可。


<script>
function showData(ret){
console.log(ret);
}
</script>
<script src="http://api.jirengu.com/weather.php?callback=showData"></script>

JSONP是通過 script 標(biāo)簽加載數(shù)據(jù)的方式去獲取數(shù)據(jù)當(dāng)做 JS 代碼來執(zhí)行 提前在頁面上聲明一個(gè)函數(shù)雹仿,函數(shù)名通過接口傳參的方式傳給后臺,后臺解析到函數(shù)名后在原始數(shù)據(jù)上「包裹」這個(gè)函數(shù)名整以,發(fā)送給前端胧辽。換句話說,JSONP 需要對應(yīng)接口的后端的配合才能實(shí)現(xiàn)公黑。

具體實(shí)現(xiàn)
server.js代碼

server.PNG

index.html代碼


index.PNG

打開Git Bash邑商,進(jìn)入server.js所在文件夾,輸入 node server.js 凡蚜,瀏覽器打開 http://localhost:8080/index.html

于是我們得出JSONP的原理

  • JSONP本質(zhì)上是利用 <script><img><iframe>等標(biāo)簽不受同源策略限制人断,可以從不同域加載并執(zhí)行資源的特性,來實(shí)現(xiàn)數(shù)據(jù)跨域傳輸朝蜘。
  • JSONP由兩部分組成:回調(diào)函數(shù)和數(shù)據(jù)恶迈。回調(diào)函數(shù)是當(dāng)響應(yīng)到來時(shí)應(yīng)該在頁面中調(diào)用的函數(shù)谱醇,而數(shù)據(jù)就是傳入回調(diào)函數(shù)中的JSON數(shù)據(jù)暇仲。
  • JSONP的想法就是,與服務(wù)端約定好一個(gè)回調(diào)函數(shù)名副渴,服務(wù)端接收到請求后奈附,將返回一段 JS代碼,在這段JS代碼中調(diào)用了約定好的回調(diào)函數(shù)煮剧,并且將數(shù)據(jù)作為參數(shù)進(jìn)行傳遞斥滤。當(dāng)網(wǎng)頁接收到這段 Javascript 代碼后,就會執(zhí)行這個(gè)回調(diào)函數(shù)勉盅,這時(shí)數(shù)據(jù)已經(jīng)成功傳輸?shù)娇蛻舳肆恕?/li>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末佑颇,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子草娜,更是在濱河造成了極大的恐慌漩符,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驱还,死亡現(xiàn)場離奇詭異嗜暴,居然都是意外死亡凸克,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門闷沥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來萎战,“玉大人,你說我怎么就攤上這事舆逃÷煳” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵路狮,是天一觀的道長虫啥。 經(jīng)常有香客問我,道長奄妨,這世上最難降的妖魔是什么涂籽? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮砸抛,結(jié)果婚禮上评雌,老公的妹妹穿的比我還像新娘。我一直安慰自己直焙,他們只是感情好景东,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奔誓,像睡著了一般斤吐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上厨喂,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天曲初,我揣著相機(jī)與錄音,去河邊找鬼杯聚。 笑死臼婆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的幌绍。 我是一名探鬼主播颁褂,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼傀广!你這毒婦竟也來了颁独?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤伪冰,失蹤者是張志新(化名)和其女友劉穎誓酒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡靠柑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年寨辩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歼冰。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡靡狞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出隔嫡,到底是詐尸還是另有隱情甸怕,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布腮恩,位于F島的核電站梢杭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏秸滴。R本人自食惡果不足惜武契,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缸榛。 院中可真熱鬧吝羞,春花似錦兰伤、人聲如沸内颗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽均澳。三九已至,卻和暖如春符衔,著一層夾襖步出監(jiān)牢的瞬間找前,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工判族, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留躺盛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓形帮,卻偏偏與公主長得像槽惫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子辩撑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 那一天界斜, 我永遠(yuǎn)都記得…… 煉妖陣內(nèi)千里冰封,已是白茫茫一片合冀。肆虐的雪花紛紛揚(yáng)揚(yáng)地飄落下來各薇,永不停歇;凜冽的寒風(fēng)裹...
    歲月素白Sissi閱讀 538評論 0 2
  • 共學(xué)日期:20190718 共學(xué)人:金豆 共學(xué)內(nèi)容:不安全依戀:愛為什么會變成牢籠君躺? 【我的思考]: 1峭判、什么樣的...
    金豆_e916閱讀 35評論 0 0
  • 《書》 習(xí)用慣而之 自道而同不相為 苦煩兩岸 各有特長揮發(fā)處 月下苦讀不枉 惜四季光陰 ...
    丨不良少年閱讀 86評論 0 1