具有标头身份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)); }
对于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中设置username
和password
的解决方法,您可以设置以下内容
将
iexplore.exe
DWORD
为0
:[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*/});