jon*_*aag 52 jquery backbone.js
我的服务器有手动授权.我需要将我的服务器的用户名/密码放入我的骨干请求,以便它通过.我怎么能这样做?有任何想法吗?谢谢
sha*_*ren 55
在骨干模型中检索,更新和使用方法破坏数据fetch,save和destroy.这些方法将实际请求部分委托给Backbone.sync.在幕后,所有人Backbone.sync都在使用jQuery创建一个ajax请求.为了合并您的Basic HTTP身份验证,您有几个选择.
fetch,save和destroy所有人都接受一个额外的参数[options].这些[options]只是一个jQuery请求选项的字典,它包含在jQuery ajax调用中.这意味着您可以轻松定义一个附加身份验证的简单方法:
sendAuthentication = function (xhr) {
var user = "myusername";// your actual username
var pass = "mypassword";// your actual password
var token = user.concat(":", pass);
xhr.setRequestHeader('Authorization', ("Basic ".concat(btoa(token))));
}
Run Code Online (Sandbox Code Playgroud)
并将其包含在每个fetch中save,并destroy打电话给你.像这样:
fetch({
beforeSend: sendAuthentication
});
Run Code Online (Sandbox Code Playgroud)
这可以创造相当多的重复.另一种选择可能是覆盖Backbone.sync方法,复制原始代码并将beforeSend选项包含在每个jQuery ajax请求中.
希望这可以帮助!
tma*_*ini 43
在Backbone.js中添加请求头的最简单方法是将它们作为参数传递给fetch方法,例如
MyCollection.fetch( { headers: {'Authorization' :'Basic USERNAME:PASSWORD'} } );
Run Code Online (Sandbox Code Playgroud)
And*_*ill 30
一个选项可能是使用jQuery ajaxSetup,所有Backbone请求最终将使用底层的jQuery ajax.这种方法的好处是你只需要将它添加到一个地方.
$.ajaxSetup({
headers: { 'Authorization' :'Basic USERNAME:PASSWORD' }
});
Run Code Online (Sandbox Code Playgroud)
编辑2018年1月2日 对于复杂的Web应用程序,这可能不是最好的方法,请参阅下面的评论.在此留下答案以供参考.
zza*_*art 18
您可以覆盖Backbone同步方法.
#coffeescript
_sync = Backbone.sync
Backbone.sync = (method, model, options) ->
options.beforeSend = (xhr) ->
xhr.setRequestHeader('X-Auth-Token_or_other_header' , your_hash_key)
#make sure your server accepts X-Auth-Token_or_other_header!!
#calling the original sync function so we only overriding what we need
_sync.call( this, method, model, options )
Run Code Online (Sandbox Code Playgroud)
小智 11
Backbone.$.ajaxSetup({
headers: {'Authorization' :'Basic USERNAME:PASSWORD'}
});
Run Code Online (Sandbox Code Playgroud)
此代码将标头设置为Backbone ajax,因此它们将与每个Backbone.sync一起发送.您可以在不使用xhr.setRequestHeader每个同步调用的情况下发送标头.
所以你不需要每次都做以下事情:
MyCollection.fetch({ headers: {'Authorization' :'Basic USERNAME:PASSWORD'} } );
Run Code Online (Sandbox Code Playgroud)
你可以这样做
MyCollection.fetch();
Run Code Online (Sandbox Code Playgroud)
也许这是一种黑客攻击,但它对我的系统来说非常有效.
我对此类方法的处理方法是覆盖sync方法,以便在执行请求之前添加标头.在示例中,您可以看到我正在创建一个Backbone.AuthenticatedModel,从中扩展而来Backbone.Model.
这将影响所有方法(GET,POST,DELETE等)
Backbone.AuthenticatedModel = Backbone.Model.extend({
sync: function(method, collection, options){
options = options || {};
options.beforeSend = function (xhr) {
var user = "myusername";// your actual username
var pass = "mypassword";// your actual password
var token = user.concat(":", pass);
xhr.setRequestHeader('Authorization', ("Basic ".concat(btoa(token))));
};
return Backbone.Model.prototype.sync.apply(this, arguments);
}
});
Run Code Online (Sandbox Code Playgroud)
然后你必须简单地扩展你需要进行身份验证的模型,从Backbone.AuthenticatedModel你创建的:
var Process = Backbone.AuthenticatedModel.extend({
url: '/api/process',
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
42209 次 |
| 最近记录: |