Javascript 具有标头身份验证的跨域请求

Javascript 具有标头身份验证的跨域请求,javascript,jquery,jsonp,Javascript,Jquery,Jsonp,我需要发送一个Get请求,该请求具有跨域来源和标头身份验证 它在Chrome和Firefox中运行良好,但我在Safari和IE中遇到问题。在随机情况下,它会返回401 <script> var url = 'username:password@anotherdomain.com'; $.ajax({ url: url, dataType: 'jsonp', jsonpCallback: "callback", success: function(js

我需要发送一个
Get
请求,该请求具有跨域来源和标头身份验证

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

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

var url='用户名:password@anotherdomain.com';
$.ajax({
url:url,
数据类型:“jsonp”,
jsonpCallback:“回调”,
成功:函数(json){
警报(json);
}
});

解决此问题的最佳选项是什么?

对于Internet Explorer
8和9,您需要使用

Internet Explorer 10+跨域请求是否与所有其他浏览器一样正常

如文档中所述,您需要

  • 使用
    var XDR=new XDomainRequest()创建XDR的对象
  • 使用
    xdr使用get方法打开连接password@anotherdomain.com");
  • 使用
    xdr.send()将数据发送回服务器
完整的代码参考如图所示

作为在internet explorer中设置
用户名
密码
的变通方法,您可以设置以下内容

DWORD
中的
iexplore.exe
0
[HKEY\U LOCAL\U MACHINE\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE\u HTTP\u USERNAME\u PASSWORD\u DISABLE]


如果我正确理解了这个问题,您可以使用beforeSend回调来对请求添加基本身份验证。这与jsonp或跨源代码无关

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

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

我建议您尝试两件事:

在ajaxSetup中,执行以下操作:

$.ajaxSetup({
    ....,
    xhrFields: {
       withCredentials: true
    },
    crossDomain: true,
    ....
});
在ajax请求中,除了凭证标志之外,还要像这样设置完整的url

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

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

你是通过Firefox或Chrome获得“随机”401,还是通过Safari和IE获得?这有规律吗?就好像url缺少相应的协议一样。您可以使用
console.log
而不是
alert
来获取JSON变量的内容。对于Safari和IE,它甚至不会执行,控制台中也不会显示任何内容。现在我发现IE不支持URL中的用户名和密码,所以我正在寻找任何其他方式,让ajax调用支持跨来源的标题验证您使用的是哪个版本的IE?我尝试了所有IE版本IE9、IE10、EDGEmakes,确保对这些类型的交互使用HTTPS$。getJSON()是$.ajax()的缩写jQuery方法,如果要解决这个问题,仍然需要解释为什么它能解决这个问题,Kevin,我不确定我以前尝试使用这种方法时是否遗漏了一些东西。工作正常。谢谢