angular - 在 Angular 6 应用程序中实现了 Auth 保护。实施不起作用。
问题描述
在 Angular 6 应用程序中实现了 Auth 保护。实施不起作用。
认证卫士
export class AuthGuard implements CanActivate {
constructor(public manageAccountService: ManageAccountService, public myRoute: Router) {}
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): boolean {
this.manageAccountService.getAccounts().subscribe(
(res) => {
if (res.d.Status == 0) {
this.myRoute.navigate([next.url[0].path.toString()]);
return true;
}
else {
window.location.href = environment.LOGIN_URL;
}
}
);
return false;
}
}
预期结果 重定向到 next.url
实际结果manageAccountService.getAccounts()
多次
卡在循环发送请求中
解决方案
发生这种情况是因为在每个生命周期步骤都运行了守卫。而且有很多。
看它好像警卫被跑了
ngOnInit
ngAfterContentInit
ngAfterContentChecked
ngAfterViewInit
ngAfterViewChecked
(好像,因为它在每个导航事件中运行,而且还有很多,而且它并没有对所有人说话)
而且您没有将订阅分配给任何变量,这意味着它会在每次调用时进行订阅。
最后,激活守卫的签名是
boolean | Observable<boolean> | Promise<boolean>
在您的情况下,您不会返回任何内容(如果您不明白为什么,请查看 RxJS 文档)。
你不应该对守卫进行 HTTP 调用,但如果你想这样做,下面是语法:
canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable < boolean > {
if (this['get_accounts_called']) { return false; }
this['get_accounts_called'] = return this.manageAccountService.getAccounts()
.pipe(map(res => res.d.Status == 0))
}
推荐阅读
- angular - 表格渲染完成后,mat-table 上是否有任何 Angular 事件?
- python - 列表上的定点迭代(colebrook)
- javascript - 使用 jquery 将大型 CSV 文件发送到服务器的正确方法是什么
- javascript - React Native Swiper ref 元素 scrollTo 在第一次渲染时不起作用
- java - 通过 sikuli 中的 http url 传递图像
- reactjs - 在 React Storybook 的单个页面上显示组件的所有变体,但仍然有旋钮?
- spring - 如何使用 RestTemplate 设置 Spring Cloud LoadBalancer?
- c - Objcopy 符号在可执行文件中混合或无效
- android - 如果适配器不是 Viewmodel 的一部分,如何应用数据绑定 Recyclerview?
- magento2 - magento 2 生产模式缓存和浏览器缓存