似乎是一个愚蠢的问题,但由于某种原因,我无法弄清楚答案。
我有一个身份验证卫士,它检查存储在本地存储中的JWT令牌的到期并引发“您的会话已过期”对话框,该对话框将用户重定向为登录onClose。
在当前状态下,仅当浏览器在存储中具有此令牌时,才会引发对话框;否则,它将直接重定向到登录页面。
导航到应用程序中的某个页面,则即使浏览器本地存储中已经存在过期的令牌,也应直接将登录页面重定向到他,而不会引发对话框。canActivate( next: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { if (!this._auth.isAuthenticated()) { if (this._auth.hasToken()) { this._dialogService.openErrorDialog('Your session has expired, please re-login', 0) .afterClosed() .subscribe(() => this.navigateToLogin(state.url)); } else { this.navigateToLogin(state.url); } return false; } return true; }
我想实现以下逻辑:当用户在某个应用页面上浏览时令牌已过期->用户导航至另一页面->抛出对话框->重定向至登录;但是,如果用户从outside
[我试图破解一些基于this的解决方案,但没有成功-尽管我可以从canActivate函数返回Observable<boolean>
,但我不知道如何制作rxjsmap
]处理pairwise
的结果-因此我可以使用先前URL的存在来确定用户来自何处。
非常感谢任何帮助。
似乎是一个愚蠢的问题,但由于某种原因,我无法弄清楚答案。我有一个身份验证卫士,它检查存储在本地存储中的JWT令牌的到期并抛出“您的会话具有...
为您创建了stackblitz示例。使用您在link中共享的信息并创建了如下服务。
@Injectable({ providedIn: "root" })
export class FirstVisitService {
readonly isFirstVisit = new BehaviorSubject<boolean>(true);
constructor(router: Router) {
router.events
.pipe(
filter(event => event instanceof NavigationEnd),
first()
)
.subscribe((e: NavigationEnd) => {
this.isFirstVisit.next(false);
this.isFirstVisit.complete();
});
}
}