当前位置: 首页 > 知识库问答 >
问题:

带拦截器的角度ngrx无限回路

单展
2023-03-14

我使用ngrx来存储我的会话信息(令牌本身和它的到期日期)。超文本传输协议管道中有两个拦截器:拦截器1将令牌从存储注入超文本传输协议请求,拦截器2从响应中读取自定义超文本传输协议标头“X-会话-到期”并将其放入存储中(我在一个拦截器中也有这两个操作,也没有解决问题)。

intercept(request: HttpRequest, next: HttpHandler): Observable> {

    return this.store.select(SessionSelectors.sessionToken).pipe(
      first(),
      mergeMap(token => {
        console.log("interceptor 1");

        if (token) {
          request = request.clone({ headers: request.headers.set('Authorization', 'User ' + token) });
        }

        return next.handle(request);
      })
    );
}
intercept(request: HttpRequest, next: HttpHandler):  Observable> {

    return next.handle(request).pipe(map((event: HttpEvent) => {
      if (event instanceof HttpResponse) {
        console.log("interceptor 2");

        if (event.headers.has("X-Session-Expiration")) {
          var value = event.headers.get("X-Session-Expiration");
          var expiration = new Date(value);

          this.store.dispatch(new SessionActions.RefreshSessionExpiration({ newExpirationDate: expiration }));
      }

      return event;
    }));
}

这将创建一个无限循环。拦截器 2 中的存储修改会触发拦截器 1 中的订阅,这会触发 http 请求,从而触发拦截器 2,依此类推。

为了防止这种情况,我在拦截器1中插入了first()或take(1),但它似乎没有改变任何东西。

共有1个答案

孟花蜂
2023-03-14

尝试在拦截器的开头添加if语句

intercept(request: HttpRequest, next: HttpHandler): Observable> {
if (request.url === 'api/refresh-token') {
    return next.handle(request);
}

 return this.store.select(SessionSelectors.sessionToken).pipe(
    mergeMap(token => {
      .....
    }

    return next.handle(requestWithToken);
  })
 );
}
 类似资料:
  • 我在网上尝试了一些建议,但没有帮助。是否需要在客户端做任何事情来修复CORS相关的问题--或者这都是服务器端的问题?

  • easyopen在1.3.1版本开始支持拦截器。 easyopen拦截器实现原理跟springmvc拦截器类似,拦截器作用在api方法上,即有@Api注解的方法。 拦截器定义如下: /** * 拦截器,原理同springmvc拦截器 * @author tanghc * */ public interface ApiInterceptor { /** * 预处理回调方法,

  • 你可以配置处理器拦截器HandlerInterceptors或web请求拦截器WebRequestInterceptors等拦截器,并配置它们拦截所有进入容器的请求,或限定到符合特定模式的URL路径。 在MVC Java编程配置下注册拦截器的方法: @Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigure

  • Uragano里可以自定义拦截器,并且拦截器分服务器端拦截器和客户端拦截器 拦截器还分全局拦截器和局部拦截器,并且拦截器也是支持依赖注入的 创建拦截器 public class ClientGlobalInterceptor : InterceptorAbstract { private ILogger Logger { get; } public

  • 功能限制拦截断点 bp EnableMenuItem 禁止或允许菜单项 bp EnableWindow 禁止或允许窗口

  • 拦截驱动器 bp GetDriveTypeA 获取磁盘驱动器类型 bp GetLogicalDrives 获取逻辑驱动器符号 bp GetLogicalDriveStringsA 获取当前所有逻辑驱动器的根驱动器路径