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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM