java後臺介面相容jsonp格式資料

weixin_33766168發表於2018-11-28

1、什麼是JSONP

一般來說位於 server1.example.com 的網頁無法與不是 server1.example.com的伺服器溝通,而 HTML 的<script> 元素是一個例外。利用 <script> 元素的這個開放策略,網頁可以得到從其他來源動態產生的 JSON 資料,而這種使用模式就是所謂的 JSONP。用 JSONP 抓到的資料並不是 JSON,而是任意的JavaScript,用 JavaScript 直譯器執行而不是用 JSON 解析器解析。
        
JSONP是一種協議,為了解決客戶端請求伺服器跨域的問題,但是並非是正式的傳輸協議。該協議的一個要點就是允許使用者傳遞一個callback引數給服務端,然後服務端返回資料時會將這個callback引數作為函式名來包裹住JSON資料,這樣客戶端就可以隨意定製自己的函式來自動處理返回資料了。
我們使用JSONP也是為了解決介面的跨域問題,因為我們的介面可能會被別的合作方呼叫,但是讓專案支援跨域請求是不安全的,因此我們要支援jsonp請求來讓別人能夠呼叫到我們的介面。若出現跨域的情況,我們的介面會報如下錯誤:No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. The response had HTTP status code 500.

2、解決方式

ajax請求程式碼
$(function(){
        $("#btn").click(function(){
            $.ajax({
                url : "http://192.168.0.199/dsp/j/content?channel=ysjssh",
                type : "GET",
				contentType: 'application/json; charset=utf-8',
				jsonpCallback:"success_jsonpCallback",
                dataType : "jsonp", // 返回的資料型別,設定為JSONP方式
                jsonp : "callback", //指定一個查詢引數名稱來覆蓋預設的 jsonp 回撥引數名 callback
                success: function(callback){
                    alert(callback);
                }
            });
        });
    });
	function callback(data) { 
		alert(data) 
	} 
後臺請求程式碼

        @RequestMapping(value = "/j/xxx", produces = "text/script;charset=UTF-8")
	@ResponseBody
	public String getxxx(HttpServletRequest request, HttpServletResponse response, String callback,) {
            Map<String, Object> resultMap = new HashMap<>();
            JSONObject object = new JSONObject(resultMap);
            return callback + "(" + object.toString() + ")";
}
劃重點!!注意RequestMapping的註解內容,加入produces


相關文章