Перехватчик не выполняется, когда я обновляю свою страницу с помощью «обновление / перезагрузка браузера» или F5

#angular #spring-security #angular7 #jwt-auth

#angular #spring-безопасность #angular7 #jwt-auth

Вопрос:

В настоящее время я изучаю angular 7, но я сталкиваюсь с проблемой и хотел бы получить вашу помощь, чтобы понять, что происходит. Я использую аутентификацию JWT (Spring Boot Security), и при каждом нажатии вызывается мой перехватчик для установки токена перед отправкой запроса на сервер. Когда я использую браузер назад / вперед, все работает нормально. Но если нажать на «обновить браузер», перехватчик не вызывается, и я получаю страницу с ошибкой белой метки. Мои вопросы: 1- почему обновление не вызывает мой перехватчик? 2. Знаете ли вы, как это можно решить?

 import { Injectable } from '@angular/core';
import { HttpInterceptor, HttpRequest, HttpHandler, HttpErrorResponse, 
HttpEvent } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import { Router } from '@angular/router';
import { TokenStorage } from './public/portal/token.storage';
import 'rxjs/add/operator/do';

 const TOKEN_HEADER_KEY = 'Authorization';
@Injectable()
export class Interceptor implements HttpInterceptor {
constructor(private token: TokenStorage, private router: Router) {
}
intercept(req: HttpRequest<any>, next: HttpHandler): 
Observable<HttpEvent<any>> {
let authReq = req;
if (this.token.getToken() != null) {authReq = req.clone({ 
    headers:req.headers.set(TOKEN_HEADER_KEY, 'Bearer '   
    this.token.getToken()) });
}
return next.handle(authReq).do(
  (err: any) => {

    if (err instanceof HttpErrorResponse) {
      if (err.status === 401) {
        this.router.navigate(['login']);
      }
    }
    console.log(err.status);
  }
);
}
}
 

Спасибо вам за то, что помогли мне

Комментарии:

1. Единственная причина, по которой я ожидал бы, что перехватчик не будет запускаться при обновлении, заключается в том, что загружаемая вами страница не инициирует никаких HTTP-вызовов. Однако обновление приведет к уничтожению служебных переменных — как хранится ваш токен? Что происходит this.token.getToken() во время ВОЗВРАТА и во время ОБНОВЛЕНИЯ — отличаются ли они? A debugger было бы полезно выше return next.handle.... .

2. чтобы сохранить токен, я использую window.sessionStorage.setItem (TOKEN_KEY, token); Во время возврата и обновления токен все еще там. Они ничем не отличаются друг от друга.

3. что означает «страница, которую вы загружаете, не инициирует никакого HTTP»?

4. любая помощь, ребята? все еще не понимаю, почему мой перехватчик не вызывается после перезагрузки браузера

5. Я также сталкиваюсь с этой проблемой. У кого-нибудь было какое-либо решение для этого?

Ответ №1:

Ладно, я это выяснил. Если вы хотите, чтобы httpinterceptor запускался после перезагрузки, ваш маршрут должен иметь защиту canactivate.

   {
    path: "members/edit", component: MembersEditComponent, canActivate: [AutoLoginAllRoutesGuard],
  },
  {
    path: "members/edit/:id", component: MembersEditComponent, canActivate: [AutoLoginAllRoutesGuard],
  },
 

Без canActivate перехватчик, похоже, не срабатывает при нажатии F5.