跨域请求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就可以了

 

 

posted on 2015-11-18 16:15  clarencexu  阅读(5216)  评论(2编辑  收藏  举报