1、什麼是JSONP
一般來說位於 server1.example.com 的網頁無法與不是 server1.example.com的伺服器溝通,而 HTML 的<script> 元素是一個例外。利用 <script> 元素的這個開放策略,網頁可以得到從其他來源動態產生的 JSON 資料,而這種使用模式就是所謂的 JSONP。用 JSONP 抓到的資料並不是 JSON,而是任意的JavaScript,用 JavaScript 直譯器執行而不是用 JSON 解析器解析。
JSONP是一種協議,為了解決客戶端請求伺服器跨域的問題,但是並非是正式的傳輸協議。該協議的一個要點就是允許使用者傳遞一個callback引數給服務端,然後服務端返回資料時會將這個callback引數作為函式名來包裹住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