天天看點

java背景接口相容jsonp格式資料

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