Как добавить собственный перехватчик в angular 4

Я написал собственный перехватчик на angular 4. Проблема, с которой я сталкиваюсь, заключается в проверке URL-адреса с помощью переменной динамического пути в URL-адресе. Бэкэнд-приложение имеет Oauth2 и развернуто на отдельном сервере (авторизация и ресурс). Класс перехватчика углового ниже

export class TokenInterceptor implements HttpInterceptor {
    private whiteList = [
        'http://localhost:8081/Test1app/oauth-server/oauth/token',
        'http://localhost:8080/ResourceApp/oauth-resource/ibex/api/signup',
        'http://localhost:8080/ResourceApp/oauth-resource/ibex/api/registeration/confirm/**',
        'http://localhost:8080/ResourceApp/oauth-resource/ibex/api/user/profile/upload',
        'http://localhost:8080/ResourceApp/oauth-resource/ibex/api/profile/edit/password/**'
    ]
    constructor(public auth : AuthenticationService) {}

    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        console.info(request.url);
        // If request is not in whitlist add header
        if (!this.whiteList.includes(request.url)) {
            console.info("I was not here");
            console.info(request.url);
            request = request.clone({
                setHeaders: {
                    Authorization: `Bearer ${this.auth.getToken()}`
                }
            });
        }

        return next.handle(request);
    }

}

проблема, с которой я сталкиваюсь сейчас, - это всякий раз, когда я пытаюсь получить доступ к http: // локальный: 8080 / ResourceApp / oauth-resource / ibex / api / profile / edit / password / 12345-2333-4444 он выполняется при условии if (запрос находится в белом списке)

Вы пробовали request.urlWithParams? Также обратите внимание, что /** в элементах массива whiteList, вероятно, работает не так, как вы ожидаете. Array.prototype.includes () использует алгоритм sameValueZero.

Jaime 20.06.2018 21:31
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
1
569
1

Ответы 1

Попробуй это:

export class TokenInterceptor implements HttpInterceptor {
  private patterns = [
    new RegExp('http://localhost:8081/Test1app/oauth-server/oauth/token'),
    new RegExp('http://localhost:8080/ResourceApp/oauth-resource/ibex/api/signup'),
    new RegExp('http://localhost:8080/ResourceApp/oauth-resource/ibex/api/registeration/confirm/.*'),
    new RegExp('http://localhost:8080/ResourceApp/oauth-resource/ibex/api/user/profile/upload'),
    new RegExp('http://localhost:8080/ResourceApp/oauth-resource/ibex/api/profile/edit/password/.*')
  ];

  constructor(public auth : AuthenticationService) {}

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    if (!this.match(request.url)) {
      request = request.clone({ setHeaders: { Authorization: `Bearer ${this.auth.getToken()}` } });
    }

    return next.handle(request);
  }

  match(url: string): boolean {
    for (const pattern of this.patterns) {
      if (Array.isArray(url.match(pattern))) { return true; }
    }

    return false;
  }

}

Рекомендации:

String.prototype.match ()

Регулярные выражения

Прохождение цикла for повлияет на производительность приложения, поскольку каждый запрос проходит через перехватчик, и в будущем белый список может увеличиться. Спасибо за ответ

joel 20.06.2018 22:35

@joel includes также зацикливает массив. За этим нет темной магии. Единственный способ избежать этого - вообще не использовать массив. Попробуйте использовать только регулярное выражение, которое соответствует всем URL-адресам, для которых требуется заголовок, или одно регулярное выражение, которое соответствует всем URL-адресам, для которых не требуется заголовок.

Jaime 20.06.2018 23:04

Что такое импорт для нового RegExp ()? В машинописном тексте?

joel 22.06.2018 16:54

Другие вопросы по теме