angular - 即使路由器导航到不受保护的元素 2,角度路由器也会调用元素 1 的 canActivate
问题描述
我有两个组件:HomeComponent
一个由 AuthGuard 保护,另一个LoginComponent
没有任何保护。
当我调用logout()
fromHomeComponent
时,我销毁令牌 fromlocalStorage
并调用this.router.navigate(['/login'])
. 这将我重定向到LoginComponent
仅一瞬间;然后我的应用程序表现得好像我试图HomeComponent
直接调用并因此canActivate()
再次调用该函数,这导致应用程序完全重新加载。
以下是我的部分代码:
登出功能
logout() {
// remove user from local storage to log user out
localStorage.removeItem('currentUser');
this.router.navigate(['/login']);
this.currentUserSubject.next(null);
}
app.routing.ts
{ path: 'login', component: LoginComponent },
{ path: '', component: HomeComponent, canActivate: [AuthGuard] },
我的 AuthGuardcanActivate()
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
const currentUser = this.authenticationService.currentUserValue;
if (currentUser) {
// authorised so return true
return true;
}
// not logged in so redirect to login page with the return url
this.router.navigate(['/login'], { queryParams: { returnUrl: state.url }});
return false;
}
我希望应用程序不会重新加载,它只是转到/login
. 我怎样才能做到这一点?
编辑 1我尝试在这里
在 stackblitz 中创建我的应用程序的迷你版本。我是 Angular 的新手,因此在那里重新创建问题几乎没有问题。单击演示中的登录按钮后,会创建一个 localStorage 项目,但路由器未导航到/
。/login...
我请求您从浏览器 URL中删除该部分,然后按 Enter 以重新加载页面。您将看到应用程序的行为方式。尝试注销并查看问题。
解决方案
发生重新加载是因为您正在使用
<a href="" ...>
注销。这告诉浏览器导航到当前 URL(即重新加载页面)。
您应该使用按钮,而不是链接。如果使用链接,至少要防止链接的默认操作:
(click)="logout($event)"
logout(event: Event) {
// ...
event.preventDefault();
}
推荐阅读
- java - 除了 CPU 和内存,线程还竞争哪些资源
- django - 使用 django 动态创建文件
- node.js - 如何解决 Angular 12 应用程序创建问题
- javascript - 在我的 Javascript 文件中传播不可交互实例的尝试无效?
- python - 如何在 FastAPI 中建立 WebSocket 安全(wss)连接
- r - R tidytext 图出现垂直而不是水平
- javascript - 为什么单选按钮切换没有反映在 redux 状态变量中?
- javascript - 这个下划线箭头语法在 JavaScript 中是什么意思?
- java - 读取给定文件后创建和写入文本文件
- java - 我正在尝试将我的 sql 数据库与 Java/spring 链接,但出现此错误