Перейти к основному содержимому

Как определить загрузочный фильтр Spring?

· 3 мин. чтения

1. Обзор

В этом кратком руководстве мы рассмотрим, как определить пользовательские фильтры и указать порядок их вызова с помощью Spring Boot.

2. Определение фильтров и порядка вызова

Начнем с создания двух фильтров:

  1. TransactionFilter — для запуска и фиксации транзакций
  2. RequestResponseLoggingFilter — для регистрации запросов и ответов .

Чтобы создать фильтр, нам просто нужно реализовать интерфейс фильтра :

@Component
@Order(1)
public class TransactionFilter implements Filter {

@Override
public void doFilter(
ServletRequest request,
ServletResponse response,
FilterChain chain) throws IOException, ServletException {

HttpServletRequest req = (HttpServletRequest) request;
        LOG.info(
"Starting a transaction for req : {}",
req.getRequestURI());

        chain.doFilter(request, response);
        LOG.info(
"Committing a transaction for req : {}",
req.getRequestURI());
}

// other methods
}
@Component
@Order(2)
public class RequestResponseLoggingFilter implements Filter {

@Override
public void doFilter(
ServletRequest request,
ServletResponse response,
FilterChain chain) throws IOException, ServletException {

HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
LOG.info(
"Logging Request {} : {}", req.getMethod(),
req.getRequestURI());
chain.doFilter(request, response);
LOG.info(
"Logging Response :{}",
res.getContentType());
}

// other methods
}

Чтобы Spring распознал фильтр, нам нужно определить его как bean-компонент с аннотацией @Component .

Более того, чтобы фильтры срабатывали в правильном порядке, нам нужно использовать аннотацию @Order .

2.1. Фильтровать по шаблону URL

В приведенном выше примере наши фильтры зарегистрированы по умолчанию для всех URL-адресов в нашем приложении. Однако иногда мы можем захотеть, чтобы фильтр применялся только к определенным шаблонам URL.

В этом случае мы должны удалить аннотацию @Component из определения класса фильтра и зарегистрировать фильтр с помощью FilterRegistrationBean :

@Bean
public FilterRegistrationBean<RequestResponseLoggingFilter> loggingFilter(){
FilterRegistrationBean<RequestResponseLoggingFilter> registrationBean
= new FilterRegistrationBean<>();

registrationBean.setFilter(new RequestResponseLoggingFilter());
registrationBean.addUrlPatterns("/users/*");
registrationBean.setOrder(2);

return registrationBean;
}

Обратите внимание, что в этом случае нам нужно явно установить порядок, используя метод setOrder() .

Теперь фильтр будет применяться только к путям, соответствующим шаблону /users/* .

Чтобы установить шаблоны URL для фильтра, мы можем использовать методы addUrlPatterns() или setUrlPatterns() .

3. Краткий пример

Теперь давайте создадим простую конечную точку и отправим на нее HTTP-запрос:

@RestController
@RequestMapping("/users")
public class UserController {

@GetMapping()
public List<User> getAllUsers() {
// ...
}
}

Журналы приложений при обращении к этому API:

23:54:38 INFO  com.spring.demo.TransactionFilter - Starting Transaction for req :/users
23:54:38 INFO c.s.d.RequestResponseLoggingFilter - Logging Request GET : /users
...
23:54:38 INFO c.s.d.RequestResponseLoggingFilter - Logging Response :application/json;charset=UTF-8
23:54:38 INFO com.spring.demo.TransactionFilter - Committing Transaction for req :/users

Это подтверждает, что фильтры вызываются в нужном порядке.

4. Вывод

В этой краткой статье мы кратко рассказали, как определить пользовательские фильтры в веб-приложении Spring Boot.

Как всегда, фрагменты кода можно найти на GitHub .