Фильтр get invoke дважды в проекте Spring Boot

java spring spring-security spring-boot

1218 просмотра

1 ответ

У меня есть фильтр, который расширяет AbstractAuthenticationProcessingFilter.

В классе конфигурации безопасности у меня есть ниже,

  @Override
    protected void configure(final HttpSecurity http) throws Exception {
        http.addFilterBefore(getMyFilter(), BasicAuthenticationFilter.class);
        http.addFilterAfter(getMyFilter2(), MyFilter.class);
        http.csrf().disable().authorizeRequests().antMatchers(HttpMethod.OPTIONS, "/**").permitAll();
    }

    private MyFilter getMyFilter() {
        return new MyFilter(properties, apiConsumer);
    }

Когда я вызываю конечную точку REST с почтальоном, doFilterметод MyFilterget ударяется дважды. В то же время он имеет то же самое requestedSessionIdи strippedServletPathв ServletRequest.

Но, MyFilter2которые расширяются GenericFilterBean, получить вызов только один раз.

Порядок выполнения фильтра MyFilter.doFilter-> MyFilter2.doFilter->MyFilter.doFilter

В чем будет причина и как я могу найти основную причину?

Автор: Harshana Источник Размещён: 08.11.2019 10:58

Ответы (1)


0 плюса

Я предполагаю, что это поведение появляется только при первом запросе (когда появляется всплывающее окно базовой аутентификации). Если так, то это потому, что спецификация базовой аутентификации и ее реализация в Spring BasicAuthenticationFilter.

Когда вы вызываете свой сервис в первый раз, Spring ищет Authorizationзаголовок по вашему запросу, а если его нет, отправляет ответ с WWW-Authenticate: Basicзаголовком в ваш браузер. Когда ваш браузер получает этот ответ с этим конкретным заголовком, он показывает всплывающее окно аутентификации. Когда вы вводите имя пользователя и пароль, ваш браузер делает еще один запрос (теперь с соответствующим Authorizationзаголовком), и теперь Spring может правильно авторизовать ваш запрос.

Проблема в том, что в течение всего этого процесса Spring обрабатывает цепочку фильтров дважды (при каждом запросе).

Вы можете прочитать больше о базовой аутентификации здесь: https://en.wikipedia.org/wiki/Basic_access_authentication

Автор: Maciej Marczuk Размещён: 20.08.2016 10:50
Вопросы из категории :
32x32