jsonp跨域請求原理分析

2021-10-11 02:27:17 字數 1852 閱讀 8607

為了解決跨域問題,開發者創造出一種非官方跨域資料互動協議——jsonp。

script:src 不受跨域限制。如下例子:即便在本地使用該標籤,也能有效訪問

src=

"">

script

>

jsonp實現原理

我們自己先建立乙個函式,請求成功並獲取到伺服器傳送的相應後,這個函式會被呼叫,注意,這個函式必須在 window 上。

>

window.

jsonpresponse

=function

(res)

script

>

利用 script 標籤訪問介面,此時我們需要將之前建立的那個函式名作為引數傳過去,引數名需要與後端約定好,一般來說我們約定成俗都會使用 callback,如下

>

window.

jsonpresponse

=function

(res)

script

>

src=

"">

script

>

此時,我們將收到伺服器的響應:

jsonpresponse

()

觀察上面的資料,我們發現伺服器給我們的資料實際上就是乙個函式呼叫,而函式名就是我們之前傳入的 callback 引數值 : jsonpresponse。另外,通過script標籤訪問位址,傳送的其實是乙個js請求,如下圖所示

結合以上例子的論證,不難明白,jsonp 請求實際上就是利用 script 標籤向伺服器傳乙個函式名。伺服器拼接乙個函式呼叫的字串傳回客戶端

自己封裝乙個 jsonp 請求

前端:

let jsonpcount =

0function

jsonp

(url, params)=$

` })}

p = url.

match

(/\?/)?

`&callback=__jp$$

` :`?callback=__jp$$

` const body = document.body

const script = document.

createelement

('script'

) script.

setattribute

('src'

, url + p)

body.

insertbefore

(script, body.children[0]

) window[

`__jp$`

]= res =>})

}

後端(nodejs):

const express =

require

('express'

)express()

get(

'/',

(req, res)

=>

// 拼接函式

const func= fnname +

'('+

json

.stringify

(resdata)

+')'

res.

send

(func)

})

JSONP跨域請求

看到jsonp我們會很自然的想到json,但它們卻有很大的不同,json是一種輕量級的資料交換格式,而jsonp可以說是一種非官方的資料互動協議。jsonp json with padding 利用jsonp可以從別的網域名稱下獲取資料,即跨域獲取資料。由於同源策略不允許xmlhttprequest...

JSONP跨域請求

前端常用ajax請求來實現不重新整理頁面方式向伺服器請求資料,但它受瀏覽器同源策略的影響而無法實現跨域請求。然而script標籤src屬性的引用卻是不受跨越限制的,基於此可以傳送跨域請求,服務端不再是返回json格式的資料,而是返回一段呼叫某個函式的js 在src中進行了呼叫。您所在的城市天氣情況 ...

jsonp跨域請求

ajax是不能跨域的,但是利用jsonp是可以實現跨域的,博主今天記錄一篇jsonp跨域的例項。通俗的說,就是利用的特殊性去請求伺服器,伺服器返回josnp格式資料,jsonp資料格式 function json 換句話說,就是把json資料報裝在乙個函式引數中返回,然後呼叫本地js中的functi...