1. 程式人生 > >Java跨域問題的處理

Java跨域問題的處理

html 問題: 自動 這樣的 鍵值 服務 範圍 代碼 lB

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

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

  上述三個方面均相同屬於同源,JavaScript默認在同源範圍內才允許通信。我們接下來通過不同的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  協議不同,域名相同,端口相同    不允許

  2.Java中處理跨域問題,通常采取兩種方法:

  (1)後臺代碼在被請求的Servlet中添加Header設置。

response.setHeader("Access-Control-Allow-Origin","*");
response.getWriter().write("{‘status‘:‘OK‘}");

  Access-Control-Allow-Origin這個Header在W3C標準裏用來檢查該跨域請求是否可以被通過,如果值為*則表明當前頁面可以跨域訪問。默認的情況下是不允許的。

  在前端JS代碼中需要向Servlet發出請求,請求代碼如下所示:

$.ajax({
       url:"http://localhost:8080/test",
       type:"post",
       data:{
            name:"Jim",
            },
       dataType:"json",
       success:function(data){
             ...
             },
       error:function(data){
             ...
       }
     })

  (2)通過jsonp跨域請求的方式。

  JSONP和JSON雖然只有一個字母的區別,但是他們完全就是兩回事,很多人很容易把他們搞混。JSON是一種數據交換的格式,而JSONP則是一種非官方跨域數據交互協議。該方式只能用於GET方式請求,不能用於POST方式請求。

  我們先來看前段JS代碼如何發送請求:

 $.ajax({
           url:"http://localhost:8080/test",
           type:"get or post",
           async:true,
           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)。

  後臺代碼如下:  

String callback = request.getParameter("callbackparam");
String json = callback + "({‘status‘:‘OK‘})";
response.getWriter().print(json);

  在後臺代碼裏,需要獲取參數名為callbackparam的值,這裏獲取到的值就是“success_jsonpCallback”。然後將這個值後面加上一對小括號,小括號裏放入你需要返回的數據內容,比如這裏我返回一個JSON對象。當然你也可以返回其他對象,比如只返回一個字符串類型數據也可以。最後前端JS接收到的數據是這樣的:

  success_jsonpCallback({‘status‘:‘ok‘})

  瀏覽器會自動解析為json對象,這時候你只需要在success回調函數中直接用data.status就可以了。

Java跨域問題的處理