如何让守卫在Angular 2中订阅服务的长轮询请求

问题描述 投票:2回答:1

我正在尝试制作旧时尚应用的角度2版本。有一项服务会向服务器发送重复请求,以检查用户是否正在登录。登录保护将检查轮询以查看登录会话结果(从请求中获取)是否有效以向路由返回正确的信号。

这是我的服务功能:

getUser(): Observable<User> { return this.http.get<User>(this.userUrl); }

这是我警卫队的canActive功能:

canActivate( next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean { // const isLoggedIn = this.authService.isLoggedIn(); return this.authService.getUser().flatMap((data) => { console.log(data); if (data.id === 1 && data.name === 'Beany' ) { console.log(1111) return Observable.of(true); } else { console.log(2222) this.router.navigate(['pages/login']); return Observable.of(false); } });

路线工作但只有一次。不确定是否可以重复此操作(当请求完成时,服务会将检查重新发送给服务,当然我应该暂停一下)?

angular service long-polling angular-router angular-guards
1个回答
4
投票

实际上我认为检查会话超时是一个好习惯。 canActivate后卫是一个简单的检查,例如用户有权打开这条路线。为了检查会话超时,我会在你的服务中加入一个计时器,它将调用后端获取信息。我还会使用HttpInterceptor来检查后端的错误。当您的后端发送带有代码401 UNAUTHORIZED的错误消息时,它会将用户导航到登录页面,您可以看到下面的示例。

@Injectable()
export class UnauthorizedInterceptor implements HttpInterceptor {

    constructor(private router: Router) { }

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

        return next.handle(req).catch(err => {
            if (err instanceof HttpErrorResponse) {
                if (err.status === 401) {
                    this.router.navigate(['/Login']);
                }
            }
            return Observable.throw(err.statusText);
        });
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.