1. 程式人生 > >如何使用 jsonp 實現跨域, 同源策略究竟是什麼鬼?

如何使用 jsonp 實現跨域, 同源策略究竟是什麼鬼?

在這裡插入圖片描述
相信上面的問題大家都遇到過。
上面是在 www.a.com/a.html 中通過 ajax 呼叫 www.b.com/a.php 時遇到的問題(注意: 兩個域名不同),為什麼會這樣呢,在回答這個問題之前,我需要先了解什麼是同源策略
同源策略 : 是在 web 應用安全模型中的重要概念。該策略規定, 只有當兩個 web 頁面同源的時候, 才允許一個頁面中的指令碼, 取訪問另一個頁面中的資料。
同源是指 URL 協議,域名和埠三者都相同, 缺一不可。
具體的可以參見下表舉例說明:
在這裡插入圖片描述
同源策略可以防止一個頁面中的惡意指令碼訪問其他頁面中的 DOM 資料
jsonp 如何實現跨域呢, 要說明這個問題, 我們先來看一下什麼是 jsonp ?
jsonp 是一種 javascript 模式, 其可以通過 標籤請求資料, 舉例如下:

<script>
        function addScriptTag(src){
	        var script = document.createElement('script');
	        script.setAttribute('type', 'text/javascript');
	        script.src = src;
	        document.body.appendChild(script);
	 }
 
	 window.onload = function(){
	        addScriptTag('https://www.b.com/index.php?callback=foo');
	 }
	 
	 function foo(data){
	       console.log('Your public IP address is: ' + data.ip);
	 }
</script>

上面的程式碼通過 建立 <script> 標籤請求了 https://www.b.com/index.php?callback=foo 獲得了資料。
事實上, 如果專案引入了 jquery 的話,可以用更簡潔的方法替代上面的原生 js 程式碼來實現跨域:

<script>
        var url = "https://www.0x400.cn/test.php?callback=foo";
        $.getScript(url)
        function foo(data){
        	console.log('Your public IP address is: ' + data.ip);
    	}
</script>

這是後臺配合 jsonp 的虛擬碼實現:

<?php 
	$json = json_encode(['ip' => 123]);
	$callback = $_GET['callback'];
	exit($callback."($json)");

上面的請求的響應內容, 這段程式碼會作為 js 程式碼在本地執行,既呼叫了 foo 方法並傳入了一個物件資料

foo({"ip":123})