在復習跨域的時候,復習到了JSONP跨域,大家都知道JSONP跨域是通過動態創建script標簽,然后通過其src屬性進行跨域請求的,前端需要一個數據處理的回調函數,而服務端需要配合執行回調函數,放入要傳過來的數據
這時候問題來了,JSONP跨域的script標簽請求為什么不受同源策略的限制?
這個問題可以這么回答:
首先,我們要理解什么是同源策略,它的作用是什么,它干了什么事。
要理解同源策略得先知道:什么是同源?
同源即 協議,域名,端口號三個完全一致,才能稱作同源
當你打開一個網站時,這個網站開始執行腳本,會檢測這個腳本的來源,如果這個腳本的來源與當前網站不同源的話,就會限制其執行,即受到同源策略的限制
MDN上對同源策略的概念解釋
同源策略限制了從同一個源加載的文檔或腳本如何與來自另一個源的資源進行交互。這是一個用於隔離潛在惡意文件的重要安全機制。
其中MDN談到了很重要的一點,IE瀏覽器的同源是不包含端口號的,即端口號不一致也是屬於同源
通俗易懂的說同源策略:不允許A的文檔或腳本與B的文檔腳本瞎搞在一起,兩個相互獨立開來,不能直接相互訪問
下面進入正題:
要理解JSONP跨域的script標簽請求為什么不受同源策略的限制這個問題的重點就在於:要執行的腳本是如何判斷他的來源的
可以這么理解,腳本的來源取決於腳本所嵌入的資源的來源,比如說訪問A主機的當前HTML文件中有一個script標簽,這個script標簽的src屬性請求了一個js腳本,因為這個腳本是由A主機的HTML文件的嵌入的script標簽發起請求獲取的,因此這個腳本的來源是屬於A主機的。
到了這里,問題的答案也就出來了,jsonp的script標簽請求回來的資源與當前域是相同的域,因此不受同源策略的影響
同源策略並非應用於不同源的窗口中的所有對象的所有屬性
對於同源策略這里還有一個很關鍵的點:同源策略並非應用於不同源的窗口中的所有對象的所有屬性。
同源策略的適用范圍:
- 它只應用到了其中的大多數屬性,尤其是對Document對象的幾乎所有屬性而言。
- 凡是包含另一個服務器中文檔的窗口或窗體,都是同源策略適用的范圍。
- 如果腳本打開一個窗口,腳本也可以關閉它,但不能以任何方式查看窗口內部。
- 同源策略還應用於使用XMLHttpRequest生成的HTTP請求。(這也就是為什么我們常用的Ajax請求會受到同源策略影響的原因了)這個對象允許客戶端JavaScript生成任意的HTTP請求到腳本所屬文檔的Web服務器,但是不允許腳本和其他Web服務器通信。
參考資料: MDN同源策略 https://developer.mozilla.org/zh-CN/docs/Web/Security/Same-origin_policy
深入理解同源策略:https://blog.csdn.net/gtLBTNq9mr3/article/details/78455211