跨域問題以及解決方法
什麼是跨域?
跨域,指的是瀏覽器不能執行其他網站的指令碼。它是由瀏覽器的同源策略造成的,是瀏覽器對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);