jsonp解決跨域
阿新 • • 發佈:2019-02-28
一個 ring quest ons 相同 文檔 內容 https arch
同源策略:瀏覽器的安全策略,指協議、域名、端口完全相同。同源或不同源指的是兩個地址間的關系。
默認,只有同源的地址之間才能相互進行ajax請求。不同源之間的請求稱為跨域請求。
jsonp解決跨域:https://bob.ippoli.to/archives/2005/12/05/remote-json-jsonp/
jsonp:json with padding的縮寫,是一種借助<script>標簽發送跨域請求的技術。
jsonp原理:通過<script>標簽發送跨域請求,請求響應一段javascript代碼,
服務端響應的這一段javascript代碼是:一個方法名,包裹一個json對象(所以叫json with padding)。
瀏覽器接收到javascript代碼後立即執行,相當於調用了一個函數。所以,我們需要預先定義好這個函數。
jsonp操作1:
<script type="text/javascript"> // 本地定義一個函數 function fun1(data) { alert(data.name); } </script> <script type="text/javascript" src="http://其他域名/js/json.js"></script>
<script type="text/javascript" src="http://其他域名/js/json.js"></script>這個標簽作用:當瀏覽器解析到該元素時,會暫停瀏覽器的渲染,直到該資源加載完畢。src指向的內容會嵌入到文檔中當前標簽所在的位置。
這個標簽的作用也就相當於:
<script type="text/javascript">
// 這裏是src="http://其他域名/js/json.js響應的內容
fun1({"name":"張三","age":10});
<script>
瀏覽器接收到javascript代碼後立即執行,調用方法 fun1({"name":"張三","age":10});
所以,上面代碼的本質是:
<script type="text/javascript"> //本地定義一個函數 function fun1(data) { alert(data.name); } </script> <script type="text/javascript"> fun1({"name":"張三","age":10}); </script>
jsonp操作2:
<script type="text/javascript"> function fun1(data) { alert(data.name + "-" + data.age); } var script = document.createElement("script"); script.src = "http://localhost/Demo01/jsonResult?jsonp=fun1"; document.body.appendChild(script); </script>
通過javascript代碼,動態發送跨域請求,"?jsonp=fun1"表示回調函數名為fun1,服務端響應的數據格式為:fun1(json對象);
服務端代碼:
@RequestMapping("/jsonResult") @ResponseBody public String fun1(String jsonp) { if(jsonp.length() > 0) { // jsonp請求 return jsonp + "(" + "{\"name\":\"張三\",\"age\":10}" + ")"; } else { return "{\"name\":\"張三\",\"age\":10}"; } }
jsonp解決跨域