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