2016-10-03 153 views
0

我使用不同的视图配置我的Backbone路由器。但在一些意见中,我需要获取一个集合。如果用户未登录,则服务器返回401 http状态。如何使用Backbone处理401未经授权的响应?

所以,我配置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

而不是修改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); 
+0

谢谢@Emile。它运作良好。 –

相关问题