關於jsonp

$.ajax({type: "get",javascript

             async: false,html

             url: "http://192.168.191.2:8080/server/userfunc/list.do",java

             data:{account:'accounttest1'},ajax

             dataType: "jsonp",spring

             success: function(json){json

                 alert(JSON.stringify(json));後端

             },跨域

             error: function(){mvc

                 alert('fail');app

             }});


隨着項目的發佈,出現了跨域的問題,所以就開始了jsonp的研究,用法很簡單如上,這個jsonp的用法跟請求json數據的用法只有一字之差,原理有大篇大篇的文章介紹我就不介紹了。


這裏還有一個問題,如圖,

數據是拿到了,可是有個警告,是否是美中不足?

這裏是後端的問題,經過上網查資料發現後端須要設置header("Content-type: application/json"),本人這裏用的是springmvc,這裏須要這樣寫:

本人親測,測試代碼以下:

/**
	 * 傳過來的字符串格式爲:{"systemGroup":"WEB", "mobileIds":"bdzfzl001,sgbj001"}
	 */
	@RequestMapping("/listFunc.do")
	public void listFunc(@RequestParam("callback")String callback, String systemGroup, String mobileIds, ModelMap model, HttpServletResponse response) {
		
		response.setContentType("application/json");
		
		logger.info("systemGroup:"+systemGroup + "|" + "mobileIds:"+mobileIds);
		String[] arrMobileId = mobileIds.trim().split(",");

		List<Map<String, Object>> dataList = map_t_func_listService.listFunc(
				systemGroup, arrMobileId);
		JsonResult res = new JsonResult(dataList);
		Object data = res.getData();
		String message = new JsonResult(data).toJson();
		logger.info("message:"+message);
		model.put("message", message);
		
		try {
			OutputStreamWriter os = new OutputStreamWriter(response.getOutputStream());
			String data1 = callback + "(" + "{\"data\":[{\"FUNC_ID\":\"bdzfzl001\",\"FUNC_TITLE\":\"變電站負載率\",\"FUNC_URL\":\"listView.html\",\"ICON_URL\":\"./img/funButton/btn_bdzfzl.png\",\"SHOW_ORDER\":\"6\"},{\"FUNC_ID\":\"sgbj001\",\"FUNC_TITLE\":\"事故報警\",\"FUNC_URL\":\"listView.html\",\"ICON_URL\":\"./img/funButton/btn_sgbj.png\",\"SHOW_ORDER\":\"9\"}],\"msg\":null,\"code\":200}" + ")";
			os.write(data1);
			os.flush();
			os.close();
		} catch(Exception e) {
			e.printStackTrace();
		}
		
	}

若是不寫response.setContentType,那麼警告會有;

若是寫成response.setContentType("application/json"),那麼警告不會有;

若是寫成response.setContentType("text/javascript"),警告也不會有;

所以總結來講,有2種寫法都是生效的。這裏本人沒有處理編碼問題,所以傳過去的多是亂碼。因此若有讀者引用本人例子時候請注意此處亂碼問題須要本身解決。

相關文章
相關標籤/搜索