2012-07-18 55 views
6

我试图授权基于this tutorial一个AJAX查询。它在使用Crypto库发送相应的授权信息之前设置请求标头。我遇到的问题是头文件似乎没有根据请求设置。这里是我的代码:jQuery的AJAX头授权

beforeSend : function(xhr) { 
    var bytes = Crypto.charenc.Binary.stringToBytes(username + ":" + password); 
    var base64 = Crypto.util.bytesToBase64(bytes); 
    xhr.setRequestHeader("Authorization", "Basic " + base64); 
}, 
+0

什么让你觉得头没有设置?你有没有检查实际的xhr呼叫?既可以'Crypto','username'或'password'设置为'undefined'?您也可以使用curl并设置标题(-H)并查看是否不是服务器端问题。顺便说一句,我是谁写的博客帖子;-) – pdeschen 2012-07-18 18:37:53

+0

我写的XHR呼叫日志,我是什么对象中找一个?我已检查过,所有3个都已正确定义。目前发生的事情是,我收到401未经授权的错误,原因很明显。这是很好的知道,好帖子。 – 2012-07-19 09:14:16

+0

Chrome浏览器,如果你打开了开发工具,并选择在底部列表中的网络选项卡,然后XHR元素,你可以检查实际的Ajax请求,它的内容,标题和所有。 – pdeschen 2012-07-19 20:26:45

回答

8

这个问题不是设置dataTypeJSONP。由于没有这样做的浏览器解释的呼叫作为一个标准的AJAX请求,这意味着它被下同源策略阻止。供参考(归功于@pdeschen的建议Crpyto)

工作代码:

<script type='text/javascript'> 
// define vars 
var username = ''; 
var password = ''; 
var url = ''; 

// ajax call 
$.ajax({ 
    url: url, 
    dataType : 'jsonp', 
    beforeSend : function(xhr) { 
     // generate base 64 string from username + password 
     var bytes = Crypto.charenc.Binary.stringToBytes(username + ":" + password); 
     var base64 = Crypto.util.bytesToBase64(bytes); 
     // set header 
     xhr.setRequestHeader("Authorization", "Basic " + base64); 
    }, 
    error : function() { 
     // error handler 
    }, 
    success: function(data) { 
     // success handler 
    } 
}); 
</script> 
+1

您也可以编码的用户名和密码'BTOA为Base64(用户名+“:” +密码)' – 2016-01-25 09:37:18

+0

@DanielHigueras不错!不知道这个功能,[看起来像它只在IE 10 +中可用],但嘿..螺丝IE – 2016-01-25 11:13:38

0

最后似乎为我工作。个人呼叫可能会发生碰撞。将此方法设置为未来连接选项的默认值。

//Function(jqXHR jqXHR) 
$.ajaxSetup({beforeSend: function(jqXHR) { 
    jqXHR.setRequestHeader("My-Header", "My-Value"); 
} }); 
+2

似乎'ajaxSetup'不再存在,所以我用'ajaxSend': \t'$(文档).ajaxSend(函数(e,xhr,设置){0} xhr.setRequestHeader(“Authorization”,“mytoken”); \t}};'。请参阅http://api.jquery.com/ajaxSend/ – falsarella 2015-03-09 18:56:49