java 聯合jQuery完成跨域名獲得數據的辦法。本站提示廣大學習愛好者:(java 聯合jQuery完成跨域名獲得數據的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是java 聯合jQuery完成跨域名獲得數據的辦法正文
1、甚麼是跨域?
因為閱讀器出於平安的斟酌,采用了同源戰略的限制,使得jQuery沒法直接跨域名相互操尴尬刁難象或數據。例如:a.com 域名下的
a.html頁面應用jQuery沒法操作b.com 域名下b.html頁面的對象或是數據, 而且默許情形下也不克不及操作test.a.com域名下的
test.html的 對象或是數據 。只需知足上面前提的jQuery都邑視為跨域名:
1.主域雷同,子域分歧,如xxx.aaa.com和yyy.aaa.com
2.域名雷同,端口分歧,如xxx.aaa.com:8000和xxx.aaa.com
3.域名雷同,協定分歧,如http://www.aaa.com/和https://www.aaa.com/
只要協定、域名、端口三者完整雷同jQuery才會視為不是跨域名的。
2、處理jQuery跨域名操尴尬刁難象的辦法
1、頂級域名一至的情形
默許情形下 a.com 域名下的 a.html頁面應用jQuery 不克不及操作test.a.com域名下的 test.html的對象或是數據。但關於這類頂級域名雷同的情形只需在a.html和test.html中重置document.domain=a.com即可。
2、頂級域名紛歧至的情形
關於 a.com 域名下的 a.html頁面應用jQuery操作b.com域名下的b.html頁面中的數據有兩辦法 $.getJSON 、$.ajax
(1)經由過程jQuery的ajax停止跨域,這實際上是采取的jsonp的方法來完成的。
jsonp是英文json with padding的縮寫。它許可在辦事器端生成script tags至前往至客戶端,也就是靜態生成javascript標簽,
經由過程javascript callback的情勢完成數據讀取。
html頁面端示例代碼:
代碼以下:
//起首要引入jquery的js包 jQuery(document).ready(function(){ $.ajax({ type : "get", //jquey是不支撐post方法跨域的 async:false, url : "http://api.jb51.net/apitools/ajax_props.do", //跨域要求的URL dataType : "jsonp", //傳遞給要求處置法式,用以取得jsonp回調函數名的參數名(默許為:callback) jsonp: "jsoncallback", //自界說的jsonp回調函數稱號,默許為jQuery主動生成的隨機函數名 jsonpCallback:"success_jsonpCallback", //勝利獲得跨域辦事器上的json數據後,會靜態履行這個callback函數 success : function(json){ alert(json); } }); });
辦事器端示例代碼,以java為例:
辦事器端代碼,是重點,開端認為,只需客戶端經由過程jsonp便可以直接跨域拜訪,其實否則,須要辦事器真個支撐才行。
代碼以下 :
public void jsonpTest() throws IOException{ HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse(); //依據html指定的jsonp回調函數的參數名,獲得回調函數的稱號 //callbackName的值其實就是:success_jsonpCallback String callbackName = (String)request.getAttribute("jsoncallback"); //簡略模仿一個json字符串,現實可以使用谷歌的gson停止轉換,次數經由過程字符串拼接 //{"name":"張三","age":28} //\是對"號停止本義 String jsonStr = "{\"name\":\"張三\",\"age\":28}"; //終究前往的數據為:success_jsonpCallback({"name":"張三","age":28}) String renderStr = callbackName+"("+jsonStr+")"; response.setContentType("text/plain;charset=UTF-8"); response.getWriter().write(renderStr); }
jsonp的道理:
起首在客戶端注冊一個callback (如:'jsoncallback'), 然後把callback的名字(如:success_jsonpCallback)傳給辦事器端對應的處置函數。
辦事器師長教師成須要前往給客戶真個 json 數據。然後以 javascript 語法的方法,生成一個function , function 名字就是傳遞下去的參數(jsoncallback)的值(success_jsonpCallback) 。
最初將 json 數據直接以入參的方法,放置到 function 中,如許就生成了一段 js 語法的文檔,前往給客戶端。
客戶端閱讀器,解析script標簽,並將辦事器端前往的數據,作為參數,
傳入到了客戶端事後界說好的 callback 函數(如上例中jquery $.ajax()辦法封裝的的success: function (json))裡。
現實上跨域是經由過程靜態增長script來加載數據,沒法直接取得數據,所以須要應用回調函數。
(2)應用jquery的getJson停止跨域讀取數據
現實上getJson方法的基本道理和ajax應用jsonp的方法是一樣的。
jquery中經常使用getJson來挪用獲得長途的數據,並經由過程json格局前往。函數的原型以下:
jQuery.getJSON(url,data,success(data,status,xhr))
參數描寫
url必須。劃定將要求發送的哪一個 URL。
data可選。劃定連同要求發送到辦事器的數據。
success(data,status,xhr)可選。劃定當要求勝利時運轉的函數。
額定的參數:
response - 包括來自要求的成果數據
status - 包括要求的狀況
xhr - 包括 XMLHttpRequest 對象
該函數是簡寫的ajax函數,現實上等價於:
代碼以下:
$.ajax({ url: url, data: data, success: callback, dataType: json });
言歸正傳,上面我們來看若何應用getJson跨域獲得數據。
html頁面示例代碼:
代碼以下:
$.getJSON("http://api.jb51.net/apitools/ajax_props.do&jsoncallback=?", function (data) { alert(data); } );
履行道理:
發送要求時須要傳一個callback的回調函數名到辦事器端,辦事器端拿到這個回調函數名,再將前往數據用參數的情勢反回到客戶端,如許客戶端就可以夠調到。
所以發送要求URL的地址前面必定要上jsoncallback=?如許的參數,jquery會將?號主動調換成主動生成的回調函數的稱號。
所以終究的現實要求為:http://api.jb51.net/apitools/ajax_props.do&jsoncallback=jsonp1322444422697
所以和ajax的方法想比擬,也就是callback函數一個是主動生成的函數名,一個是手工指定的函數名。
留意以下幾點:
1.發送到數據吸收方的地址前面必定要加上callback=?如許的參數,且這個?是會被Jquery主動調換成回調辦法的稱號。(在Jquery1.4中可以本身指定回調辦法的稱號了)
2.留意js劇本發送數據的data不克不及寫成var data="{'username':'sanjer','userid':'110'}";而是要寫成var data={username:'sanjer',userid:'110'},這點要留意。要想吸收辦事器端前往的數據必需辦事器端封裝數據為JSON格局字符串並和callback值一道前往。(請細心看下面的示例代碼)。
3.因為挪用Jquery的$.getJSON辦法時,Jquery有本身的處置,現實上經由過程script的scr要求的,但要曉得,數據終究照樣經由過程url前面經由過程get方法發送數據出去的,這就決議了,發送的data數據量不克不及太多,不然形成url太長吸收掉敗(getJSON方法是弗成能有post方法遞交的)。
假如要跨域發送年夜數據量則選用jQuery供給的ajax辦法,最好不選用getJSON辦法。
4.以上的例子是站在兩方面的開辟都由你掌控的條件下的。且要留意辦事器法式真個平安系數不高(建議數據吸收端這邊不要放主要、敏感的邏輯處置單位)。
以上這篇java 聯合jQuery完成跨域名獲得數據的辦法就是小編分享給年夜家的全體內容了,願望能給年夜家一個參考,也願望年夜家多多支撐。