如何使用 Backbone 处理 401 未经授权的响应?
How to handle a 401 unauthorized response with Backbone?
我用不同的视图配置我的 Backbone 路由器。但是在某些观点上,我需要获取一个集合。如果用户没有登录,服务器 returns 一个 401 http 状态。
所以,我这样配置 jQuery 的全局 ajax 设置:
$.ajaxSetup({
xhrFields: {
withCredentials: true
},
crossDomain: true,
error: function(jqXHR, textStatus, errorThrown) {
console.log("error ajax");
if (jqXHR.status == 401) {
console.log('error 401');
app.router.navigate('', { trigger: true });
}
}
});
但它永远不会进入错误回调,即使响应代码是 401。
我没有全局修改 ajax 选项,而是修改了 Backbone.sync
函数来处理身份验证。
Backbone.sync = (function(syncFn) {
return function(method, model, options) {
options = options || {};
var beforeSend = options.beforeSend,
error = options.error;
// Add headers
options.beforeSend = function(xhr) {
xhr.setRequestHeader('withCredentials', true);
if (beforeSend) return beforeSend.apply(this, arguments);
};
// handle unauthorized error (401)
options.error = function(xhr, textStatus, errorThrown) {
console.log("error sync");
if (error) error.call(options.context, xhr, textStatus, errorThrown);
if (xhr.status === 401) {
console.log('error 401');
app.router.navigate('', { trigger: true });
}
};
return syncFn.apply(this, arguments);
};
})(Backbone.sync);
我用不同的视图配置我的 Backbone 路由器。但是在某些观点上,我需要获取一个集合。如果用户没有登录,服务器 returns 一个 401 http 状态。
所以,我这样配置 jQuery 的全局 ajax 设置:
$.ajaxSetup({
xhrFields: {
withCredentials: true
},
crossDomain: true,
error: function(jqXHR, textStatus, errorThrown) {
console.log("error ajax");
if (jqXHR.status == 401) {
console.log('error 401');
app.router.navigate('', { trigger: true });
}
}
});
但它永远不会进入错误回调,即使响应代码是 401。
我没有全局修改 ajax 选项,而是修改了 Backbone.sync
函数来处理身份验证。
Backbone.sync = (function(syncFn) {
return function(method, model, options) {
options = options || {};
var beforeSend = options.beforeSend,
error = options.error;
// Add headers
options.beforeSend = function(xhr) {
xhr.setRequestHeader('withCredentials', true);
if (beforeSend) return beforeSend.apply(this, arguments);
};
// handle unauthorized error (401)
options.error = function(xhr, textStatus, errorThrown) {
console.log("error sync");
if (error) error.call(options.context, xhr, textStatus, errorThrown);
if (xhr.status === 401) {
console.log('error 401');
app.router.navigate('', { trigger: true });
}
};
return syncFn.apply(this, arguments);
};
})(Backbone.sync);