1. 程式人生 > >jsonp解決跨域

jsonp解決跨域

一個 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解決跨域