json和jsonp的使用區別jquery
JavaScript出於安全方面的考慮,不容許跨域調用其餘頁面的對象。web
JSON是一種基於文本的數據交換方式(不支持跨域),而JSONP是一種非官方跨域數據交互協議。ajax
使用json格式傳遞數據的客戶端代碼以下:json
1 $(function () { 2 var user = { 3 "username": "HelloWorld" 4 }; 5 6 $.ajax({ 7 url: "http://localhost:8080/Changyou/UserInfo", 8 type: "POST", 9 contentType: "application/json; charset=utf-8", 10 dataType: "json", //json不支持跨域請求,只能使用jsonp 11 data: { 12 user: JSON.stringify(user) 13 }, 14 success: function (data) { 15 $("#user_name")[0].innerHTML = data.user_name; 16 $("#user_teleNum")[0].innerHTML = data.user_teleNum; 17 $("#user_ID")[0].innerHTML = data.user_ID; 18 }, 19 error: function () { 20 alert("請求超時錯誤!"); 21 } 22 }) 23 });
然而,簡單地使用json並不能支持跨域資源請求,爲了解決這個問題,須要採用jsonp數據交互協議。衆所周知,js文件的調用不受跨域與否的限制,所以若是想經過純web端跨域訪問數據,只能在遠程服務器上設法將json數據封裝進js格式的文件中,供客戶端調用和進一步處理,這就是jsonp協議的原理。該協議的一個要點就是容許用戶傳遞一個callback參數給服務端,而後服務端返回數據時會將這個callback參數做爲函數名來包裹住JSON數據,這樣客戶端就能夠隨意定製本身的函數來自動處理返回數據了。跨域
簡單的說,就是json不支持跨域,而js能夠跨域,所以在服務器端用客戶端提供的js函數名將json數據封裝起來,再將函數提供給客戶端調用,從而得到json數據。安全
開發過程當中,若是出現相似 「Origin ****** is not allowed by Access-Control-Allow-Origin.」 的錯誤,則多是因爲json數據不支持跨域致使的,應考慮使用jsonp協議。服務器
若是出現相似 」SyntaxError: Unexpected token ':'. Parse error.「 的錯誤,則多是因爲返回的json數據沒有用」callback「傳遞的函數名封裝致使的。app
客戶端代碼以下:函數
1 $(function () { 2 3 var user = { 4 "username": "HelloWorld" 5 }; 6 7 $.ajax({ 8 url: "http://localhost:8080/Changyou/UserInfo", 9 type: "POST", 10 contentType: "application/json; charset=utf-8", 11 dataType: "jsonp", //json不支持跨域請求,只能使用jsonp 12 data: { 13 user: JSON.stringify(user) 14 }, 15 jsonp: "callback", //傳遞給請求處理程序或頁面的,用以得到jsonp回調函數名的參數名,默認爲callback 16 jsonpCallback: "userHandler", //自定義的jsonp回調函數名稱,默認爲jQuery自動生成的隨機函數名,也能夠寫"?",jQuery會自動爲你處理數據 17 success: function (data) { 18 $("#user_name")[0].innerHTML = data.user_name; 19 $("#user_teleNum")[0].innerHTML = data.user_teleNum; 20 $("#user_ID")[0].innerHTML = data.user_ID; 21 }, 22 error: function () { 23 alert("請求超時錯誤!"); 24 } 25 }) 26 });
服務器端代碼以下:jsonp
1 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2 response.setContentType("application/json; charset=utf-8"); 3 String username = new String(request.getParameter("user").getBytes("ISO-8859-1"),"utf-8"); 4 String callback = new String(request.getParameter("callback").getBytes("ISO-8859-1"),"utf-8"); 5 System.out.println("接收到的數據:" + username); 6 System.out.println("callback的值:" + callback); 7 JSONObject user = JSONObject.fromObject(username); 8 System.out.println("接收到的用戶名:" + user.get("username")); 9 JSONObject userinfo = new JSONObject(); 10 userinfo.put("user_name", "張鳴曉"); 11 userinfo.put("user_teleNum", "18810011111"); 12 userinfo.put("user_ID", "123456789098765432"); 13 PrintWriter out = response.getWriter(); 14 String backInfo = callback + "(" + userinfo.toString() + ")"; //將json數據封裝在callback函數中提供給客戶端 15 out.print(backInfo); 16 out.close(); 17 }
儘管客戶端沒有實現userHandler函數,但也能成功運行,緣由就是jquery在處理jsonp類型的ajax時,自動幫你生成回調函數並把數據取出來供success屬性方法來調用。