天天看點

面試彙總——知道什麼是同源政策嗎?那怎麼解決跨域問題?知道 JSONP 原理嗎?

本文是面試彙總分支——知道什麼是同源政策嗎?那怎麼解決跨域問題?知道 jsonp 原理嗎?。

同源政策(same origin policy)是一種約定,它是浏覽器最核心也最基本的安全功能,如果缺少了同源政策,則浏覽器的正常功能可能都會受到影響。 可以說web是建構在同源政策基礎之上的,浏覽器隻是針對同源政策的一種實作。

同源政策,它是由netscape提出的一個著名的安全政策。現在所有支援javascript 的浏覽器都會使用這個政策。所謂同源是指,域名,協定,端口相同。

當一個浏覽器的兩個tab頁中分别打開來 百度和谷歌的頁面當浏覽器的百度tab頁執行一個腳本的時候會檢查這個腳本是屬于哪個頁面的,即檢查是否同源,隻有和百度同源的腳本才會被執行。

如果非同源,那麼在請求資料時,浏覽器會在控制台中報一個異常,提示拒絕通路。

域名、協定、端口相同,也就是在同一個域裡。

cookie不能讀取 (如我在自己的站點無法讀取部落格園使用者的cookie)

dom無法獲得

ajax請求不能發送

例如:

  一個域的頁面去請求另一個域的資源;

  a域的頁面去請求b域的資源。

面試彙總——知道什麼是同源政策嗎?那怎麼解決跨域問題?知道 JSONP 原理嗎?

動态添加一個<script>标簽,而script标簽的src屬性是沒有跨域的限制的。

這樣一來,這種跨域方式就與ajax xmlhttprequest協定無關了。

jsonp即json with padding

由于同源政策的限制,xmlhttprequest隻允許請求目前源(域名、協定、端口)的資源。

如果要進行跨域請求, 我們可以通過使用html的script标記來進行跨域請求,并在響應中傳回要執行的script代碼,其中可以直接使用json傳遞javascript對象,這種跨域的通訊方式稱為jsonp。 

json 是一種資料格式 jsonp 是一種資料調用的方式

首先在用戶端注冊一個callback (如:'testjsonpcallback'), 然後把callback的名字(如:testjsonpcallback)傳給伺服器。

注意:

  服務端得到callback的數值後,要用testjsonpcallback(......)把将要輸出的json内容包括起來,此時,伺服器生成 json 資料才能被用戶端正确接收。 

    然後以 javascript 文法的方式,生成一個function, function 名字就是傳遞上來的參數 'callback'的值 testjsonpcallback.

  最後将 json 資料直接以入參的方式,放置到 function 中,這樣就生成了一段 js 文法的文檔,傳回給用戶端。 

       用戶端浏覽器,解析script标簽,并執行傳回的 javascript 文檔,此時javascript文檔資料,作為參數, 傳入到了用戶端預先定義好的 callback 函數.

用通路端通路目标主機,目标主機能成功傳回 "函數名("參數")" , 表示成功跨域。

感謝:​​什麼是同源政策,什麼是跨域,如何跨域,jsonp/cors跨域​​

作者:習慣沉澱

掃碼關注一線碼農的學習見聞與思考。

回複"大資料","微服務","架構師","面試總結",擷取更多學習資源!