跨域请求POST,GET以及IE浏览器下方法总结
对于跨域请求,第一时间,大家想到的肯定是jsonp,也就是利用script标签去跨域请求。
尤其是jquery封装好了jsonp,使用起来跟ajax一样方便简洁,然而,既然是利用script标签,就意味着不能采用post请求,即使你这样写了
$.ajax({
dataType: 'jsonp',
url: domain,
method:'post',
success: function(data) {
callback && callback();
}
});
你以为就可以post了么,jquery就像个善良的美少女,表面清新的骗过了你。不过如果你是一个闯荡江湖的老手,你就会瞬间意识到,虽然不报错!script请求是怎么post的啊!坑爹啊!
然后你打开浏览器,机智的看了一下请求,发现浏览器默默的发送了一个get,你明白了,被jquery美丽清新的外表欺骗了。泪奔(灰脸。。。)
言归正传!那么
1、跨域的post请求如何做到
很简单,现代浏览器支持这么写
$.ajax({
url: domain,
crossDomain: true,
xhrFields: {
withCredentials: true
},
dataType: 'json',
success: function(data) {
callback && callback();
}
});
请注意这个重要的参数,crossDomain,jquery也做了封装,但是使用这样的方式你需要跟后端的兄弟配合,让后端加上header,具体加法
最简单的就是设置header("Access-Control-Allow-Origin:*");
但是需要后端兄弟根据不同情况去修改(不过这是后端大大的锅,前端的我们直接甩╮( ̄▽ ̄)╭)
1.1、这种跨域请求方式如何带上cookie
如果你的请求需要带上cookie,那么就需要加上这个withCredentials,设置为true就可以在请求的时候加上cookie了。
然后很开心的准备提测,突然虎级灾害降临,要兼容IE。。。ヽ(`Д´)ノ
2、IE下如何实现跨域post请求
对于IE,是肯定不可能用这么简单便捷的方式解决问题的,如果可以,那还能叫ie么。首先,ie8并不支持XMLHttpRequest,而只能用XDomainRequest,
jquery妹子却只支持XMLHttpRequest,如果你的请求不需要带cookie,那么请使用这个
https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest/blob/master/jQuery.XDomainRequest.js
简单好用,是兼容ie的jquery跨域请求
如果你是ie9+,那么使用了这个js后就放心的把ie当好伙伴,使用之前的withCredentials去带cookie
但是如果你是ie8,而且正好你需要在请求中带上cookie,那么问题来了
2.1、IE下如何实现跨域post请求并且带cookie
jquery行不通了,ajax行不通了,jsonp又只能处理get请求,对于post请求,貌似还有表单提交这么个东西。
那么就使用iframe仿造表单提交来进行post请求吧。干货如下:
var extendHTML = "<form id='iePost' name='iePost' method='post' action=''></form><iframe width='0' height='0' id='iePostIframe' name='iePostIframe'></iframe><script type='text/javascript'>document.domain = '改成你请求的域名';</script>"
$('body').append(extendHTML);
var browser = navigator.appName
var b_version = navigator.appVersion
var version = b_version.split(";");
var trim_Version = version[1].replace(/[ ]/g, "");
if (browser == "Microsoft Internet Explorer" && trim_Version == "MSIE8.0") {
request.ajax = function(opt) {
var form = $("#iePost")[0];
form.action = opt.url;
for (var p in opt.data) {
$("#iePost").append('<input type="hidden" id="' + p + '" name="' + p + '" value="' + opt.data[p] + '">');
}
form.target = "iePostIframe";
form.submit();
var success = opt.success;
$("#iePostIframe").off();
$("#iePostIframe").load(function() {
var result = this.contentWindow.document.body.innerHTML;
var length = result.length;
success($.parseJSON(result.substring(1, length - 1)));
$("#iePost").children().remove();
});
}
} else {
request.ajax = function(opt) {
var fn = {
error: function(XMLHttpRequest, textStatus, errorThrown) {
if (XMLHttpRequest.readyState === 0) return;
},
success: function(data, textStatus) {}
}
if (opt.error) {
fn.error = opt.error;
}
if (opt.success) {
fn.success = opt.success;
}
var _opt = $.extend(opt, {
crossDomain: true,
xhrFields: {
withCredentials: true
},
dataType: 'json',
error: function(XMLHttpRequest, textStatus, errorThrown) {
fn.error(XMLHttpRequest, textStatus, errorThrown);
},
success: function(data, textStatus) {
fn.success(result, textStatus);
}
});
_ajax(_opt);
};
}
重写了$.ajax,
拷贝这段代码后,把你的$.ajax换成request.ajax就可以了