0

作为我的前端 MV* 框架,我只能在 angularjs 和 dojo 之间进行选择。在我看来,一项至关重要的特殊功能是能够进行不显眼且透明的身份验证。angular 在这方面使用 http 拦截器的能力给我留下了深刻的印象。请参阅http://www.espeo.pl/2012/02/26/authentication-in-angularjs-application以获得良好的示例实现/解释。

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

我想比较道场做同样事情的能力,但从我的考试来看,这似乎是不可能的。检查 dojo 文档,似乎这在 dojo 1.4 中使用 ioPipline 可能是可能的,但是不推荐使用这有利于 dojo/request/notify 似乎没有提供低级别的拦截(特别是它收到错误时似乎无法访问请求对象)。也不清楚是否可以从通知功能中修改或替换响应...

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

4

1 回答 1

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将被拦截,并调用提供的方法。如果您想有条件地仅将某些请求与此处理程序匹配,您可以传递另一个测试器函数作为第一个参数。这在上面链接的参考指南中有详细说明。

然后,您的处理程序函数需要做的就是返回一个最终将解析为预期数据的承诺。

于 2013-07-02T22:08:42.137 回答