面試整理(2)跨域 jsonp與CORS

2022-09-08 05:24:10 字數 2803 閱讀 6155

問題:跨域有哪些方法?jsonp的原理是什麼?

jsonp:

先說jsonp,jsonp的主要原理是利用script標籤的src可以跨域請求,據說有src屬性的都可以跨域請求,但script標籤返回的會直接執行,所以都是用script請求。jsonp=json+padding,padding是指伺服器返回資料時把資料用padding(函式)包裹了起來。也就是說,一般情況下瀏覽器向伺服器傳送請求得到的都是資料(文字,xml,json),但是當採用jsonp技術時候,瀏覽器向跨域伺服器傳送請求,得到的是**函式包住的json。此處json作為引數傳入**函式,然後再返回給瀏覽器。

這裡寫乙個例子:其中後台用的nodejs

前端**:index.html

後台**:server.js

上面的例子中,index.html中定義了乙個jsonpcallback函式,並且把這個函式名通作為callback欄位的值以get的請求(src的請求只能是get)傳送給服務端。服務端接收到之後通過callback欄位拿到**函式名,然後用這個函式名包裹要返回的資料,形成乙個字串,發給前端

例子在node環境下執行:node server.js,然後再執行index.html就可以看到前端跨域請求的結果。例子中由於index.html是本地的,所以跟伺服器不同源,普通的請求會被拒絕。

服務端寫的時候要注意,返回的是乙個很像函式呼叫的字串,它不並不是後台對callback函式的呼叫,所以要把返回的物件用json.stringify轉化一下,再加上字串的兩個括號

cors:

jsonp說完之後,再說乙個常用的跨域方法cors。主要參考阮一峰大神的資料:

cors分簡單請求和非簡單請求,同時滿足下面兩個條件的就是簡單請求,否則就是非簡單請求

簡單請求:請求頭通過origin字段用來說明,本次請求來自哪個源(協議 + 網域名稱 + 埠)。伺服器根據這個值,決定是否同意這次請求。

我在實際測試時先不使用關於cookie的一些可選字段,就簡單的在前端設定origin在後端設定access-control-allow-origin這種必須的字段來測試。

發現前端的ajax設定origin欄位會報錯-》refused to set unsafe header "origin"

雖然不影響請求的傳送,但設定的origin欄位是無效的,不管我設定什麼或者不設定這個欄位時檢視origin欄位時它的值都是null,網上查了之後在stackoverflow上有人說那個origin欄位本來就應該是瀏覽器來設定的,自己設定不安全。

猜想只要瀏覽器發現請求的目標不是同源的,就會自己給報文加origin欄位。所以只要在後端設定access-control-allow-origin欄位為*(表示接受任意origin的請求)就可以了。

前端**:簡單的ajax即可

服務端**:server.js

非簡單請求:除去可選字段,在非簡單請求中服務端還要指定access-control-request-method來表示自己接受的請求的方法,把之前的ajax中的方法從get改為put

前端**:index.html

如果後台沒有在access-control-request-method中新增put方法就會報錯-》failed to load http://localhost:3000/: method put is not allowed by access-control-allow-methods in preflight response.

後端**:server.js

新增了access-control-request-method:「put」後請求成功。

非簡單方法瀏覽器會先發起乙個method為option的「預檢」來跟伺服器驗證自己的請求是不是被允許,如果伺服器回的頭中沒有請求的方法或者引數,那麼瀏覽器就知道不允許,將不傳送ajax請求。如果有,瀏覽器才會再傳送那個ajax請求。

「預檢」請求:

cors和jsonp的區別主要在於:jsonp只支援get請求,而cors支援所有型別的請求,只不過cors要求至少ie10,jsonp相容以前的版本。

5 28面試 跨域與Jsonp

今天面試發現jsonp完全忘了啊,前端的跨域手段竟然被我搞前端的忘了 jsonp是一種解決跨域的通訊方式。原理 利用script標籤的src屬性來實現跨域。js指令碼 css樣式檔案 這三者是可以與頁面本身不同源的 通過將前端方法作為引數傳遞到伺服器端,然後由伺服器端注入引數之後再返回,實現伺服器端...

跨域,json與jsonp格式

好久都沒有寫隨筆了,最近大家都忙著考試要放假了,我也要忙一忙嘍.不過再忙我還是來啦 簡單的說,json是一種輕量級的資料交換格式。平時我們使用ajax等使用的一種資料形式,那麼今天就說說jsonp是個什麼鬼。首先接觸的時候也是一臉懵逼,都不清楚這是什麼東西,上網搜啊查啊,最後才弄明白了。我們平時在寫...

使用XHR2或Jsonp實現跨域以及實現原理

報這個錯誤 其實瀏覽器成功傳送請求並拿回了資料 只是瀏覽器的同源策略 禁止了獲取 在xhr2 伺服器端支援跨域 需要在響應頭增加 access control allow origin 代表任何域。也可以指定位址 access control allow methods post,get 支援的方法...