具有标头身份validation的跨域请求

我需要使用头部身份validation发送带有跨域源的Get请求。

它在Chrome和Firefox中运行良好,但我在Safari和IE中遇到问题。 在随机的情况下,它返回401。

  var url = 'username:password@anotherdomain.com'; $.ajax({ url: url, dataType: 'jsonp', jsonpCallback: "callback", success: function(json) { alert(json); } });  

什么是解决这个问题的最佳选择?

如果我已正确理解了问题,您可以使用beforeSend回调在请求中添加基本身份validation。 这与jsonp或cross-origin无关。

 beforeSend: function (xhr) { xhr.setRequestHeader ("Authorization", "Basic " + btoa(username + ":" + password)); } 

https://jsfiddle.net/rn9Lp304/

对于Internet Explorer 8 and 9您需要使用XDomainRequest对象

Internet Explorer 10+通常像所有其他浏览器一样执行跨域请求。

正如您需要的文档中所述

  • 使用var xdr = new XDomainRequest(); 创建XDR的对象 var xdr = new XDomainRequest();
  • 使用xdr.open("get", "username:password@anotherdomain.com"); 使用get方法打开连接 xdr.open("get", "username:password@anotherdomain.com");
  • 使用xdr.send(); 将数据发送回服务器 xdr.send();

完整的代码参考可以在@Mark Pieszak的 这个主题上 显示

作为在Internet Explorer中设置usernamepassword的解决方法,您可以设置以下内容

iexplore.exe DWORD0[HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_HTTP_USERNAME_PASSWORD_DISABLE]

我会建议你尝试两件事:

在ajaxSetup中,执行以下操作:

 $.ajaxSetup({ ...., xhrFields: { withCredentials: true }, crossDomain: true, .... }); 

在您的ajax请求中,除了凭证标志外,还要设置完整的URL。

 'Access-Control-Allow-Origin: https://not-example.com' 'Access-Control-Allow-Credentials: true' 

对于具有身份validation的服务器,这些浏览器不允许在此标头中使用“*”。 Access-Control-Allow-Origin标头必须包含客户端传递的Origin标头的值。

使用getJSON

 $.getJSON("url",function (data) {/*code here*/});