jQuery的Ajax的跨域請求


   今天碰到一個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"這一樣代碼,其實還是那句話,多一行代碼而已,多大點事兒。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM