1. 程式人生 > >跨域問題以及解決方法

跨域問題以及解決方法

什麼是跨域?

跨域,指的是瀏覽器不能執行其他網站的指令碼。它是由瀏覽器的同源策略造成的,是瀏覽器對javascript施加的安全限制。

所謂同源是指,域名,協議,埠均相同,不明白沒關係,舉個栗子:

http://www.123.com/index.html 呼叫 http://www.123.com/server.php (非跨域)

http://www.123.com/index.html 呼叫 http://www.456.com/server.php (主域名不同:123/456,跨域)

http://abc.123.com/index.html 呼叫 http://def.123.com/server.php (子域名不同:abc/def,跨域)

http://www.123.com:8080/index.html 呼叫 http://www.123.com:8081/server.php (埠不同:8080/8081,跨域)

http://www.123.com/index.html 呼叫 https://www.123.com/server.php (協議不同:http/https,跨域)

請注意:localhost和127.0.0.1雖然都指向本機,但也屬於跨域。

瀏覽器執行javascript指令碼時,會檢查這個指令碼屬於哪個頁面,如果不是同源頁面,就不會被執行。

解決辦法:

1、JSONP:

使用方式就不贅述了,但是要注意JSONP只支援GET請求,不支援POST請求。

2、代理:

例如www.123.com/index.html需要呼叫www.456.com/server.php,可以寫一個介面www.123.com/server.php,由這個介面在後端去呼叫www.456.com/server.php並拿到返回值,然後再返回給index.html,這就是一個代理的模式。相當於繞過了瀏覽器端,自然就不存在跨域問題。

3、伺服器端修改header

HttpServletResponse response=ServletActionContext.getResponse();
//伺服器端解決跨域問題
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS,DELETE,PUT");
response.addHeader("Access-Control-Allow-Headers", "Test");
response.getWriter().write(jsonString);

    前端ajax設定

     function test() {
    $.ajax({
        type: "GET",
        url: "http://47.94.129.191:8080/getWifiUdpInfo/udp_downloadJson.action",
        timeout: 60000,
        async: true,
        dataType:'json',
    beforeSend: function (xhr) {  
           xhr.setRequestHeader("Test", "testheadervalue");  
        },

        success: function(data) {    
            console.log(data);
        },
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.readyState);
alert(textStatus);
}


    });
}
setInterval(test,2000);