Javascript 带有IE、XMLHttpRequest和ssl(https)的CORS
我遇到了一个通过Ajax进行通信以使用另一台服务器的restful服务的应用程序的问题 当使用IE的应用程序位于具有ssl的服务器中时,我的意思是,当我从同一台服务器从其他服务器使用相同的服务时,一切正常 我在服务器()上安装了具有SSL的Restful服务 我必须从其他服务器(有或没有ssl证书)使用这些 使用Internet Explorer进行测试,我得到以下结果:Javascript 带有IE、XMLHttpRequest和ssl(https)的CORS,javascript,ajax,internet-explorer,xmlhttprequest,cors,Javascript,Ajax,Internet Explorer,Xmlhttprequest,Cors,我遇到了一个通过Ajax进行通信以使用另一台服务器的restful服务的应用程序的问题 当使用IE的应用程序位于具有ssl的服务器中时,我的意思是,当我从同一台服务器从其他服务器使用相同的服务时,一切正常 我在服务器()上安装了具有SSL的Restful服务 我必须从其他服务器(有或没有ssl证书)使用这些 使用Internet Explorer进行测试,我得到以下结果: 如果我使用本地工厂提供的服务 如果我使用同一个盒子中的服务(restful (b)工程 如果我在没有ssl的情况下使用另一
- 如果我使用本地工厂提供的服务
- 如果我使用同一个盒子中的服务(restful (b)工程
- 如果我在没有ssl的情况下使用另一台服务器的服务
- 但是当我在https上使用服务器上的服务时,它就不工作了 即
function load(_url, _callback, _params, _type, _htmlMethod, _onStartFunction, _onFinishFunction) {
var xhr;
if (isFunction(_onStartFunction)) { _onStartFunction(); }
ieVersion = getInternetExplorerVersion();
if (typeof XMLHttpRequest !== 'undefined') {
console.log("XMLHttpRequest");
xhr = new XMLHttpRequest();
}else {
if (ieVersion > 7){
console.log("XDomainRequest");
xhr = new XDomainRequest();
}else{
var versions = [ "MSXML2.XmlHttp.5.0", "MSXML2.XmlHttp.4.0", "MSXML2.XmlHttp.3.0", "MSXML2.XmlHttp.2.0", "Microsoft.XmlHttp" ];
for ( var i = 0, len = versions.length; i < len; i++) {
try {
console.log("ActiveXObject: " + versions[i]);
xhr = new ActiveXObject(versions[i]);
break;
} catch (e) { /* attempt next one*/ }
}
}
}
xhr.onreadystatechange = ensureReadiness;
if (_type == JSON_TYPE) {
contentType = "application/json";
}else{
contentType = 'text/plain';
}
function ensureReadiness() {
if (xhr.readyState < 4) { return; }
if (xhr.status !== 200) {
showServiceDown();
if (isFunction(_onFinishFunction)) { _onFinishFunction();}
return;
}
if (xhr.readyState === 4) {
if (isFunction(_onFinishFunction)) {_onFinishFunction(); }
var responseText = "";
responseText = xhr.responseText;
if (_type == JSON_TYPE) {
_callback(responseText);
} else if (_type = HTML_TYPE) {
var replaced = responseText.replace(/\\/g, '///');
_callback(replaced);
} else { _callback(responseText); }
}
}
if ((_htmlMethod == undefined) || (_htmlMethod == null) || (_htmlMethod == "")) {
_htmlMethod = METHOD_POST;
}
xhr.open(_htmlMethod, _url, true);
xhr.withCredentials = true;
xhr.setRequestHeader("Content-type", contentType);
_params = (_params != undefined) ? _params : null;
xhr.send(_params);
}
函数加载(\uURL、\uCallback、\uParams、\uType、\uHtmlMethod、\uOnStartFunction、\uOnFinishFunction){
var-xhr;
if(isFunction(_onStartFunction)){u onStartFunction();}
ieVersion=getInternetExplorerVersion();
if(XMLHttpRequest的类型!=“未定义”){
log(“XMLHttpRequest”);
xhr=newXMLHttpRequest();
}否则{
如果(ieVersion>7){
console.log(“XDomainRequest”);
xhr=新的XDomainRequest();
}否则{
var版本=[“MSXML2.XmlHttp.5.0”、“MSXML2.XmlHttp.4.0”、“MSXML2.XmlHttp.3.0”、“MSXML2.XmlHttp.2.0”、“Microsoft.XmlHttp”];
对于(变量i=0,len=versions.length;i
我不能为这个项目使用任何javascript框架
这些证书是mede公司内部的,仅供内部使用,因此任何浏览器验证邮件都会失败,我不知道这是否与问题有关
我希望任何人都能找到解决这个问题的办法
非常感谢您抽出时间 我遇到了一个类似的问题,在IE情况下,通过向XDomainRequest添加一个虚拟的
onprogress
回调来解决:
if (ieVersion > 7){
console.log("XDomainRequest");
xhr = new XDomainRequest();
xhr.onprogress = function() {}; // <-- add this
}
我试过了,也没用:S。。我注意到,当在internet explorer属性->安全->安全设置中,我选择跨域访问数据源作为启用,。。它适用于IE..@cesaregb我添加了一个过去对我有效的代码示例,实际上有效了。。将XDomainRequest用于IE并添加onprogress和onload侦听器。。。他妈的,谢谢,像这样的乳液,但不起作用。它在xdr.open时失败。我的想法是它不喜欢认证?我最后ping:https:mysite.mydomain.com/something/foo和设置{type=“GET”,标题:{Authentication:“Basic 2nms8i23g8-”},成功:function(){},error:function(){},data:{},它只是说:IE CORS请求的访问被拒绝。值得注意的是,我研究了一个类似的问题(这并不是为了反驳paislee在编写它的时候)IE11中不再实现XDR,jQuery中也不再包含$.browser。随着时间的推移,这是一个很好的解决方案。
/**
* Wraps jQuery's AJAX, adds X-Domain support for IE
*
*
*/
function xDomainAJAX (url, settings) {
jQueryRequired();
$.support.cors = true; // enable x-domain
if ($.browser.msie && parseInt($.browser.version, 10) >= 8 && XDomainRequest) {
// use ms xdr
var xdr = new XDomainRequest();
xdr.open(settings.type, url + '?' + $.param(settings.data));
xdr.onprogress = function() {};
xdr.onload = function() {
settings.success(xdr.responseText);
};
xdr.onerror = settings.error;
xdr.send();
} else {
// use jQuery ajax
$.ajax(url, settings);
}
}