Java跨域問題的處理詳解

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就能夠了。

相關文章
相關標籤/搜索