Java跨域問題的處理詳解


1,JavaScript由於安全性方面的考慮,不允許頁面跨域調用其他頁面的對象,那么問題來了,什么是跨域問題?

答:這是由於瀏覽器同源策略的限制,現在所有支持JavaScript的瀏覽器都使用了這個策略。那么什么是同源呢?所謂的同源是指三個方面“相同”:
1,域名相同
2,協議相同
3,端口相同

2,下面就舉幾個例子來幫助更好的理解同源策略。
URL 說明 是否允許通信

 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發出請求,請求代碼如下所示:

    $.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)。

4,下面,最重要的來了,后台怎么樣獲取和返回數據呢。代碼如下所示:

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就可以了。


免責聲明!

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



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