今天碰到一個Ajax跨域請求的問題,我把源碼down下來,然后在服務器端寫了一個http請求的代理(因為服務器端是不存在跨域問題的),說白了就是用BufferedReader寫了個IO流,然后讀取到目標地址的數據,測試發現OK,但是問題出現在,asp的項目存在IIS里面,而我們的java代碼是放在其他服務器的容器中,asp的請求無論如何都是跨域的,我們是無法在IIS里面部署jsp的,所以這個辦法行不通。
於是上網查了下,發現可以使用jsonp的方式實現跨域。其實原理也很簡單,就是利用<script>標簽的src來實現跨域獲取數據,而jQuery的Ajax也正好支持並且封裝了這種方式,思路是客戶端以jsonp的這種方式(協議)向目標服務器發送請求,服務器端構建出一個callback的回調函數,類似JS的方法+參數的字符串返回給客戶端,客戶端調用自己寫好的回調函數來執行這段js代碼,於是就實現了跨域請求的目的。
jQuery給出了兩種情況的跨域請求,一種是get/getJSON的方式,另一種是$.ajax()的方式,原理都差不多,只是寫法不一樣,多幾行代碼而已,多大點事兒,哈哈,於是我在本地服務器上同時運行了2個project,端口分別是8080和8081,在8081的客戶端上面請求8080端口的數據,端口不同也是跨域。
1 $.getJSON("http://localhost:8080/my/t1.jsp?callback=?", 2 function(result) {});
1 function m1(data) { 2 alert(data); 3 }
1 $.ajax({ 2 url: "http://localhost:8080my/t1.jsp?callback=?", 3 dataType: "jsonp", 4 jsonpCallback: "m1", 5 success: function(data) {} 6 });
1 function m1(data) { 2 alert(data); 3 }
服務器端Java代碼:
String str = "{[\"name1\": \"json\",\"name2\": \"json\",\"name3\": \"json\"]}";
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(str);
json = "m1(" + json + ")";
response.getWriter().print(json);
說明:第一種方式的callback=?回調函數標志着Ajax請求是以jsonp的方式發送請求,客戶端請求會自動在問號處增加一個方法名,方法名是一jquery開頭的一串數字,而第二種方式的是參數dataType="jsonp"來說明是以jsonp的方式發送請求,所以可以直接在callback后面直接指定方法名callback=m1,而不需要jsonpCallback: "m1"這一樣代碼,其實還是那句話,多一行代碼而已,多大點事兒。
