Как сделать так, чтобы охранник подписывался на длинный запрос службы в Angular 2
Я пытаюсь сделать угловую 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);
}
});
Маршрут работает но только 1 раз. Не уверен, возможно ли повторить это действие (служба отправит проверку службе, когда запрос будет завершен, конечно, я должен сделать для него небольшой тайм-аут)?
1 ответ
На самом деле я не думаю, что это хорошая практика - проверять время ожидания сессии. canActivate
guard - это простая проверка, например, что у пользователя есть разрешение открыть этот маршрут или нет. Для проверки тайм-аута сеанса я бы добавил в ваш сервис таймер, который будет вызывать бэкэнд для получения информации. Я бы также использовал 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);
});
}
}