Пружинный фильтр теряет заданные переменные после функции init - PullRequest
1 голос
/ 11 апреля 2019

У меня странная проблема с простым пружинным фильтром, который я использую. В функции init я устанавливаю переменную this.test = "TEST1234", но по какой-то причине при достижении функции doFilter эта переменная снова обнуляется.

Мой фильтр:

@Component
public class TestFilter implements Filter {
    private String test;

    public void init(FilterConfig cfg) {
        this.test = "TEST1234";
        System.out.println("TEST: " + this.test);

    }

    public void doFilter(
        ServletRequest request,
        ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
        System.out.println("TEST: " + this.test);
    }

    public void destroy() {}
}

SecurityConfig:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .addFilterBefore(
                    new TestFilter(), 
                    AbstractPreAuthenticatedProcessingFilter.class
                );
    }
}

Выход на консоль:

init: TEST: TEST1234 doFilter: TEST: null

Почему эта переменная возвращается к нулю? Я что-то пропустил? Это мусор?

Я запускаю свое приложение на Java 1.8.0_171

Зависимости:

  • Пружинная стартовая паутина: 2.1.4.RELEASE
  • Пружина безопасности JWT: 1.0.10.RELEASE
  • Пружина безопасности oauth2: 2.2.1.RELEASE
  • Javax-сервлет: 2.5

1 Ответ

0 голосов
/ 11 апреля 2019

Решил благодаря комментарию от @dur.

Сначала я удалил аннотацию @Component, чтобы мой фильтр не создавался дважды.

Фильтр:

public class TestFilter implements Filter {
    private String test;

    public void init(FilterConfig cfg) {
        this.test = "TEST1234";
        System.out.println("TEST: " + this.test);

    }

    public void doFilter(
        ServletRequest request,
        ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
        System.out.println("TEST: " + this.test);
    }

    public void destroy() {}
}

Также я создал экземпляр фильтра как bean вместо прямого вызова newFilter() в функции addFilterBefore().

SecurityConfig:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    public TestFilter testFilter() {
        return new TestFilter();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .addFilterBefore(
                        testFilter(),
                        AbstractPreAuthenticatedProcessingFilter.class
                );
    }
}

Вывод на консоль (теперь, как и ожидалось):

init: TEST: TEST1234 doFilter: TEST: TEST1234

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...