угловой - как справиться с редиректом - PullRequest
0 голосов
/ 12 сентября 2018

Я использую Spring Security, которая перенаправляет неаутентифицированных пользователей на страницу входа.

Таким образом, когда неаутентифицированный угловой клиент отправляет запрос GET конечной точке (ожидая JSON), он получает HTML-содержимое страницы входа в систему, и синтаксический анализатор JSON дает сбой ( Angular2 наблюдает за перенаправлением 302 при получении ресурса * 1004) *)

const httpObservable = this.http.get(urlThatWillRedirect).subscribe(data => ...) // JSON parser will fail

Как я могу обработать перенаправления в Angular?

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Правильное решение состоит в том, чтобы изменить код на стороне сервера так, чтобы он не возвращал 302 кода состояния, поскольку браузер запускает перенаправление до того, как Angular (или любой SPA в этом отношении) сможет что-то с этим сделать. Обычно вы хотите вернуть 401/403 с этой целью.

Если это невозможно, единственной альтернативой является реализация хакерского решения, чтобы каким-то образом распознать, что ответ действительно является перенаправлением, и обработать его соответствующим образом с помощью HttpInterceptors. Вот эквивалентный пример в AngularJS .

В Angular 2+, вы, вероятно, можете выполнить что-то вроде этого , чтобы проверить, является ли ответ перенаправленной страницей:

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next.handle(req)
      .do(event => {
        if (event instanceof HttpResponseBase) {
          const response = event as HttpResponseBase;
          if (response && response.ok && response.url && response.url.toLowerCase().indexOf(this.logoPartialUrl) >= 0) {
            // Modify this portion appropriately to match your redirect page
            const queryStringIndex = response.url.indexOf('?');
            const loginUrl = queryStringIndex && queryStringIndex > 0 ? response.url.substring(0, queryStringIndex) : response.url;
            console.log('User logout detected, redirecting to login page: %s', loginUrl);
            window.location.href = loginUrl;
          }
        }
      });
0 голосов
/ 12 сентября 2018

Перенаправьте страницу на error в случае ненормальных кодов service response. Вы можете справиться с этим, добавив метод в класс service и добавив его к catch из Observable ответа. Вероятно, мы будем обрабатывать этот тип ответа для 401 или 403, так как @ I46kok сказал, что попытаться изменить также и коды ошибок

   public serviceMethod(){
           this.http.get(urlThatWillRedirect).catch(this.handleError).subscribe(data =>...);
      }


   private handleError(error:any){
           if(error.code == 302 || error.code == 401){
           // clear your user credentials here like localStorage,Auth token etc..
           window.location.href = '/#/error';
           return Observable.throw(error.json());
          }
        }
0 голосов
/ 12 сентября 2018

Это не совсем чисто, и я бы порекомендовал обрабатывать маршрутизацию и состояния, используя Router и Guards.Но если JSON-синтаксический анализатор дает сбой (и это определение для , не вошедшего в систему , возможно, вы сможете обработать перенаправление на стороне клиента с помощью обработчика ошибок.

const httpObservable = this.http
                                .get(urlThatWillRedirect)
                                .subscribe(
                                  (data) => {//handle data},
                                  (error) => {// redirect to login page}          
                                ); 
...