1,JavaScript因爲安全性方面的考慮,不容許頁面跨域調用其餘頁面的對象,那麼問題來了,什麼是跨域問題?前端
答:這是因爲瀏覽器同源策略的限制,如今全部支持JavaScript的瀏覽器都使用了這個策略。那麼什麼是同源呢?所謂的同源是指三個方面「相同」:
1,域名相同
2,協議相同
3,端口相同ajax
2,下面就舉幾個例子來幫助更好的理解同源策略。
URL 說明 是否容許通訊json
http://www.a.com/a.js http://www.a.com/b.js 同一域名 容許 http://www.a.com/a.js http://www.b.com/a.js 不一樣域名 不容許 http://www.a.com:8000/a.js http://www.a.com/b.js 同一域名不一樣端口 不容許 https://www.a.com/a.js http://www.a.com/b.js 同一域名不一樣協議 不容許
3,在JAVA中處理跨域問題,一般有如下兩種經常使用的解決方法。
1,第一種解決方法
後臺代碼在被請求的Servlet中添加Header設置:跨域
response.setHeader("Access-Control-Allow-Origin", "*");
PrintWriter out =null;
try
{
out = response.getWriter();
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
out.print("{'status':'ok'}");
out.flush();
out.close();瀏覽器
Access-Control-Allow-Origin這個Header在W3C標準裏用來檢查該跨域請求是否能夠被經過,若是值爲*則代表當前頁面能夠跨域訪問。默認的狀況下是不容許的。安全
在前端JS中須要向Servlet發出請求,請求代碼以下所示:async
$.ajax({ url: "your url", type:"get or post", dataType:"json", data:{ .... }, success:function(data){ ... }
第二種解決方法
經過jsonp跨域請求的方式。JSONP和JSON雖然只有一個字母的區別,可是他們徹底就是兩回事,不少人很容易把他們搞混。JSON是一種數據交換的格式,而JSONP則是一種非官方跨域數據交互協議。
首先來講一下前端JS是怎麼發送請求。代碼以下所示:函數
$.ajax({ url:"your url", type:"get or post", async:false, dataType : "jsonp", //服務端用於接收callback調用的function名的參數 jsonp:"callbackparam", //callback的function名稱 jsonpCallback:"success_jsonpCallback", success:function(data){ console.log(data); }, error:function(data){ console.log(data); } });
這裏的callbackparam和success_jsonpCallback能夠理解爲發送的data數據的鍵值對,能夠自定義,可是callbackparam須要和後臺約定好參數名稱,由於後臺須要獲取到這個參數裏面的值(即success_jsonpCallback)。post
4,下面,最重要的來了,後臺怎麼樣獲取和返回數據呢。代碼以下所示:jsonp
PrintWriter out =null;
String callback=req.getParameter("callbackparam");
String json=callback+"({'status':'ok'})";
try
{
out = resp.getWriter();
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
out.print(json);
out.flush();
out.close();
首先須要獲取參數名爲callbackparam的值,這裏獲取到的值就是「success_jsonpCallback」。而後將這個值加上一對小括號。小括號裏放入你須要返回的數據內容,好比這裏我返回一個JSON對象。固然你也能夠返回其餘對象,好比只返回一個字符串類型數據也能夠。最後前端JS返回的數據就是這樣的:
success_jsonpCallback({'status':'ok'})
瀏覽器會自動解析爲json對象,這時候你只須要在success回調函數中直接用data.status就能夠了。