如何使用Backbone处理401未经授权的响应?

时间:2016-10-03 11:56:19

标签: javascript jquery backbone.js

我使用不同的视图配置我的Backbone路由器。但在某些观点上,我需要获取一个集合。如果用户未登录,则服务器返回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。

1 个答案:

答案 0 :(得分:1)

我没有修改全局的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);