由于浏览器的同源策略,导致前后端交互时跨域的存在
- cors背后的基本思想,就是使用自定义的http头部让浏览器与服务器进行沟通。
发送ajax请求时,需要额外的附加一个Origin头部,包含请求页面的源信息(协议,域名和端口),如果服务器认为这个请求可以接受,就在Access-Control-Allow-Origin头部中回发相同的源信息。浏览器查看服务器返回的这个头部,如果源信息不匹配就会驳回请求。
- 举个例子
ajax:
Origin:https://www.baidu.com
服务端设置:
Access-Control-Allow-Origin:‘https://www.baidu.com’
或者
Access-Control-Allow-Origin:‘*’
Firefox3.5+、Safari4+、Chrome、IOS版的safari和Android平台中的WebKit都通过XMLHttpRequest对象实现了对CORS原生的支持!所以前端跨域请求资源时,无需做任何设置,直接在open()方法中传入绝对url即可(ie8-用jq即可:因为ie8是用的XDR对象而不是XHR对象,XHD不支持同步,其他基本相同)!
var xhr = new XMLHttpRequest();
xhr.open("get","http://www.anywhere.com",true);
xhr.onreadystatechange = function(){
if(xhr.readyState==4){
if((xhr.status>=200&&xhr.status<300)||xhr.status==304){
alert(xhr.responseText);
}else{
alert(xhr.status);
}
}
}
xhr.send(null);
//或者用jq
$.ajax({
url:'http://www.anywhere.com',
data:{userId:'123'},
success:function(){}
});
//如此后台配置允许跨域即可
其他跨域方式
- jsonp(只支持get方式,需要后台配合)
原理:利用script标签的额src属性
用jq的话用法很简单,只需设置dataType:'jsonp'即可。如需自定义回调函数名称的话,加上 jsonp:'cb'和jsonpCallback:'feng'两个设置,拼在url的形式是'cb=feng'。
$.ajax({
url:'https://www.baidu.com/his?rf=3',
dataType:'jsonp',
jsonp:'cb',
jsonpCallback:'feng',
success:function (result) {
console.log(result);
}
})
- nginx(这个应该是最方便快捷的方式了吧,前后端代码都不用改)
原理:反向代理,不受浏览器同源策略的限制
修改nginx配置文件,使本地端口映射到服务器端口
(具体配置就不做详细描述了,自行百度吧)
当然还有window.name、iframe、img等方式,貌似只要时带有src属性的标签都可以跨域,因为这些现在基本已经用的很少了,就不做介绍了吧。
网友评论