如何让 guard 订阅 Angular 中服务的长轮询请求 2
How to make guard subscribes to a long polling request of a service in Angular 2
我正在尝试制作一个 angular 2 版本的老式应用程序。有一项服务向服务器发送重复请求以检查用户是否正在登录。登录守卫将检查轮询以查看登录会话结果(从请求中获取)是否有效 return 路由的正确信号。
这是我的服务功能:
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);
}
});
该路线有效,但只有 1 次。不确定是否可以重复此操作(服务会在请求完成后重新向服务发送支票,当然我应该为此设置一点超时)?
实际上,我认为检查会话超时不是一个好习惯。 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);
});
}
}
我正在尝试制作一个 angular 2 版本的老式应用程序。有一项服务向服务器发送重复请求以检查用户是否正在登录。登录守卫将检查轮询以查看登录会话结果(从请求中获取)是否有效 return 路由的正确信号。
这是我的服务功能:
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);
}
});
该路线有效,但只有 1 次。不确定是否可以重复此操作(服务会在请求完成后重新向服务发送支票,当然我应该为此设置一点超时)?
实际上,我认为检查会话超时不是一个好习惯。 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);
});
}
}