Ajax+SpringMVC實現跨域請求

下半夜的雨發表於2018-08-10

什麼是跨域請求:所謂跨域請求,就是在一個專案裡面請求另一個專案的controller。

為什麼要跨域請求:瀏覽器的同源策略是瀏覽器上為安全性考慮實施的非常重要的安全策略。從一個域上載入的指令碼不允許訪問另外一個域的文件屬性。

造成跨域的原因和解決方法

一、普通請求

普通請求的Ajax:

$.ajax({
    url: "threshold/testAjax",//請求地址
    type: "POST",
    dataType: "json",
    async:false,
    success: function(data) {//data是預設的,接收前臺返回的資料
        $("#id").val(data.id);
        $("#voltage").val(data.voltage);
        $("#electric").val(data.electric);
    }
});

普通請求的Controller:

	@RequestMapping(value = "testAjax", method = RequestMethod.POST)
	@ResponseBody
	public Threshold testAjax(){
		List<Threshold> thresholds = thresholdService.findAll();
		if(thresholds != null && thresholds.size() > 0){
			return thresholds.get(0);
		} else {
			return null;
		}
		
	}

二、跨域請求:

跨域請求的Ajax:

	$.ajax({
		type: "GET",
		url: "http://192.168.1.120:8080/CallPolice-1/threshold/getJsonp",//請求地址
	    async:true,//預設為true,不使用非同步false執行時會等success中結束再繼續執行下面
	    dataType: "jsonp",
	    jsonpCallback:"callback",  //Jquery生成驗證引數的名稱
	    success: function(data) {//data是預設的,接收前臺返回的資料
	        alert("dasdas---"+JSON.stringify(data));
	    }
	});	
	function callback(data){
	    var jsonobj = eval('(' + data + ')'); 
	    if(jsonobj.orderCount!=""){
	        alert("回撥成功");
	    } 
	}

跨域請求的Controller:

	/*
	 * 測試跨域請求
	 * */
	@RequestMapping(value="getJsonp",method=RequestMethod.GET)
    @ResponseBody
    public void test(HttpServletRequest request,HttpServletResponse response){
        response.setHeader("P3P", "CP=CAO PSA OUR");
        response.addHeader("Access-Control-Allow-Origin", "*");
        String data = request.getParameter("data");
        //1:業務邏輯
        JSONObject returnMap = new JSONObject();
        //2:輸入json資料到前臺頁面
        returnMap.put("name", "test name");
        returnMap.put("age", 11);
        returnMap.put("address", "test address");
        PrintWriter pWriter = null;
        try {
            pWriter = response.getWriter();
            pWriter.write("callback('" + returnMap.toString() + "')");
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }finally{
            if(pWriter!=null){
                pWriter.flush();
                pWriter.close();
            }           
        }

    }

 

相關文章