最近遇到一个关于ajax跨域请求,特此,我在这里总结一下ajax跨域请求的问题吧。
原因:
1,浏览器会校验ajax跨域请求,如果不通过就会报跨域安全问题;
2,请求不是本域的请求(协议,域名,端口不同都称为不是本域);
3,发出去的请求是(XMLHttpRequest)请求,简称XHR请求;
三个原因都存在才会产生跨域安全问题!
解决:
1,浏览器客户端对跨域请求不进行校验(需要用户自己更改浏览器的配置,不合适);
cmd启动浏览器时
start chrome.exe --args --disable-web-security --user-data-dir
2,造成跨域问题的第二个原因,通过被调用方或调用方进行更改(重点);
①被调用方更改:
这里就是涉及到被调用方代码改为支持跨域请求,在请求时,请求会先执行到后台,然后浏览器再判断,因此我们在响应头里增加指定的字段 response.header("access-control-allow-origin","*");
这种不能满足所有的请求,如果是携带cookie的请求时
$.ajax({
xhrFieIds:{
withCredentials:true
}
});
response.header("access-control-allow-origin","*");必须使用访问域名,不能使用*的通配符,
还需添加response.header("access-control-allow-Credentials","true");
②调用方更改
由于种种情况,我们不能更改服务端代码,所以,我们可以从代理着手,通常使用nginx进行反向代理。
配置一个server{
listen 8080;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location /apis {
rewrite ^.+apis/?(.*)$ /$1 break;
include uwsgi_params;
proxy_pass http://localhost:8080;
}
}
③,第三个原因,我们通常采用jsonp请求方式去请求;
之所以用jsonp是因为请求的不是xhr请求,而是包装了一下,JavaScript请求,这种请求,在后台有个callback方法。
所以在服务器端需要改动。