JSONP跨域

1.瀏覽器的同源策略

  • 同源策略限制了從同一個源加載的文檔或腳本如何與來自另一個源的資源進行交互。這是一個用于隔離潛在惡意文件的重要安全機制。

2.一個源的定義
如果兩個頁面的協(xié)議,端口和域名都相同,則兩個頁面具有相同的源,這就是同源。
http://www.example.com/dir/page.html這個網(wǎng)址,協(xié)議是http://,域名是www.example.com,端口是80(默認(rèn)端口可以省略)。它的同源情況如下。

  • http://www.example.com/dir2/other.html:同源
  • http://example.com/dir/other.html:不同源(域名不同)
  • http://v2.www.example.com/dir/other.html:不同源(域名不同)
  • http://www.example.com:81/dir/other.html:不同源(端口不同)

參考文章


同源政策規(guī)定,AJAX請求只能發(fā)給同源的網(wǎng)址,否則就報錯。


JSONP實現(xiàn)跨域訪問數(shù)據(jù)

JSONP(JSON with Padding)是JSON的一種“使用模式”
由于同源策略,一般來說位于 server1.example.com 的網(wǎng)頁無法與不是server1.example.com的服務(wù)器溝通,而 HTML<script>元素是一個例外。

ajax請求受同源策略影響,不允許進行跨域請求

而script標(biāo)簽src屬性中的鏈接卻可以訪問跨域的js腳本,利用這個特性,服務(wù)端不再返回JSON格式的數(shù)據(jù),而是返回一段調(diào)用某個函數(shù)的js代碼,在src中進行了調(diào)用,這樣實現(xiàn)了跨域。

JSONP是服務(wù)器與客戶端跨源通信的常用方法。最大特點就是簡單適用,老式瀏覽器全部支持,服務(wù)器改造非常小。

JSONP的基本思想是,動態(tài)創(chuàng)建一個<script>元素,script元素發(fā)送請求不熟同源政策的限制,只能發(fā)送get請求。服務(wù)器收到請求后,將數(shù)據(jù)放在一個指定名字的回調(diào)函數(shù)里傳回來。

<script>//SRL server rendered javascript
        button.addEventListener('click', (e) => {
            //動態(tài)創(chuàng)建script
            var script = document.createElement('script')
            let functionName='blog1'+parseInt(Math.random()*100000,10)
            
            //callback
            window[functionName]=function(result){
                if(result==='success'){
                    amount.innerText=amount.innerText-1
                }else{} 
            }
            //發(fā)送請求
            script.src = 'http://feile.com/pay?callback='+functionName
            document.body.appendChild(script)
            
            script.onload = function (e) {
                // debugger
                e.currentTarget.remove()
                delete window[functionName]
            }
            script.onerror = function (e) {
                alert('fail')
                e.currentTarget.remove()
                delete window[functionName]
            }
        })
    </script>
    

上面的代碼通過動態(tài)創(chuàng)建添加script元素,向服務(wù)器發(fā)送請求,查詢字符串必須有callback參數(shù),用來指定回調(diào)函數(shù)的名字。

response.write(`${query.callback}.call(undefined,'success')`)

服務(wù)器收到這個請求以后,會將數(shù)據(jù)放在回調(diào)函數(shù)的參數(shù)位置返回。這時只要瀏覽器定義了對應(yīng)的回調(diào)函數(shù),該函數(shù)就會立即被調(diào)用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評論 19 139
  • 瀏覽器安全的基石是“同源政策”(same-origin policy)。很多開發(fā)者都知道這一點,但了解得不全面。 ...
    許先生__閱讀 366評論 0 1
  • 1: 什么是同源策略 最初,它的含義是指,A網(wǎng)頁設(shè)置的 Cookie,B網(wǎng)頁不能打開,除非這兩個網(wǎng)頁"同源",所謂...
    好奇而已閱讀 350評論 0 0
  • <!DOCTYPE html> div>span{display: block;} // ...
    戰(zhàn)神飄雪閱讀 631評論 0 0
  • IMBAIZEXI閱讀 83評論 0 1

友情鏈接更多精彩內(nèi)容