如何使用dojo完全拦截和重新排队http请求

时间:2013-07-02 18:22:08

标签: angularjs dojo interceptor

我选择angularjs和dojo作为我的前端MV *框架。在我看来,一个特别重要的功能是能够进行不显眼和透明的身份验证。使用http拦截器在这方面我对angular的能力印象非常深刻。有关良好的示例实现/解释,请参阅http://www.espeo.pl/2012/02/26/authentication-in-angularjs-application

它允许在等待成功登录时排队任何和所有401响应,然后在登录成功后通过使用广播事件,事件处理和http拦截器(加上请求队列)的组合重新传输它们。每个请求的开销似乎很小。

我想比较道场做同样的能力,但从我的检查看似乎不可能。检查dojo文档,看来这可能是在使用ioPipline的dojo 1.4中可能实现的,但是不赞成使用dojo / request / notify,这似乎不提供拦截的低级别(特别是它在收到错误时似乎没有访问请求对象)。还不清楚是否可以修改或替换通知函数内的响应...

有人能指出我使用dojo的请求/通知服务或使用dojo的替代方法完成的明确示例吗?关键要求是认证对受保护的功能/控制器/对象是透明的(它们应该只接收最终实现的承诺),认证代码能够集中化(它不需要修改每个对象/事件/提出请求的等等,并且它应该是安全的(在某种意义上,认证/授权应该在服务器端发生,并且没有javascript操作应该能够绕过该要求)...

1 个答案:

答案 0 :(得分:0)

您可以在dojo/request/registry内注册处理程序,以任意方式拦截和处理使用dojo/request发出的请求。以下是基于参考指南修改(未经测试,可能略有缺陷)的示例:

require([ "dojo/request/registry", "dojo/request/xhr" ], function (registry, xhr) {
  request.register(function (url, options) {
    return xhr(url, options).response.then(function (response) {
      if (response.status === 401) {
        // retry later
      }

      return response;
    });
  }, true);
});

通过上面的示例,将拦截使用dojo/request发出的任何请求,并且将调用所提供的方法。如果您希望有条件地仅使用此处理程序匹配某些请求,则可以将另一个测试器函数作为第一个参数传递。这在上面链接的参考指南中有详细说明。

然后,您需要做的所有处理函数都返回一个最终会解析为预期数据的promise。