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

时间:2016-12-23 06:33:56

标签: 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(json) {
        alert(json);
    }
});
</script>

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

4 个答案:

答案 0 :(得分:2)

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

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

https://jsfiddle.net/rn9Lp304/

答案 1 :(得分:1)

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

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

如您需要的文档中所述

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

完整的代码参考可以在this thread

@Mark Pieszak上显示

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

  在DWORDiexplore.exe0

[HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_HTTP_USERNAME_PASSWORD_DISABLE]

答案 2 :(得分:0)

我建议你尝试两件事:

在ajaxSetup中,执行以下操作:

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

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

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jerry;

对于具有身份验证的服务器,这些浏览器不允许&#34; *&#34;在这个标题中。 Access-Control-Allow-Origin标头必须包含客户端传递的Origin标头的值。

答案 3 :(得分:-3)

使用getJSON

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