前端Ajax請求代碼如下:
window.onload=function()
{
var url='http://127.0.0.1:8080/testpj/ErrorlogServlet';
$.ajax({
type : "GET",
url : url,
async: false,
dataType: "jsonp",
jsonp: "callback",
beforeSend: function() {},
success : function(data) {
alert('ok');
},
error : function() {
alert('false');
}
});
}
后台Servlet接口如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("utf-8"); response.setContentType("application/json"); JSONObject jsonObject = new JSONObject(); String callback = request.getParameter("callback"); String jsondata = "{\"logPath\":\"1\",\"success\":true}"; String res = callback + "(" + jsondata + ")"; PrintWriter out = null; try { out = response.getWriter(); out.write(res); } catch (IOException e) { e.printStackTrace(); } finally { if (out != null) { out.close(); } } }
先說JSON與JSONP:JSON(JavaScript Object Notation)是一種數據交換格式,而JSONP(JSON with Padding)是一個可以解決瀏覽器跨域問題的協議。
再說JSONP原理:由於瀏覽器同源策略,Ajax直接請求其他服務接口會存在跨域問題,但我們又會發現web頁面調用js文件時則不受跨域問題影響(比如<script>、<img>、<iframe>),如果想通過web跨域訪問數據就只能在服務端把數據裝進js格式的文件里,供客戶端調用。於是,JSONP協議出現了,該協議允許用戶傳遞一個callback參數給服務端,然后服務端返回數據時會將這個callback參數作為函數名來包裹住JSON數據,這樣客戶端就可以隨意定制自己的函數來自動處理返回數據了。
最后談談Ajax與JSONP:上面客戶端獲取遠程數據的方式看起來非常像Ajax,但其實並不一樣,Ajax(Asynchronous Javascript and XML)核心是 JavaScript 對象XMLHttpRequest,通過這個對象,Javascript向服務器提出請求並處理響應而不阻塞用戶。而JSONP的核心是動態添加<script>標簽來調用服務器提供的js腳本。
本例中,前端代碼因為使用到了JSONP,后台Servlet接口開始並沒有加上callback參數,所以才出現前端Ajax請求拿不到JSON數據情況出現。
