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

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

 1. обзор

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

Дальнейшее чтение:

Найти зарегистрированные весенние фильтры безопасности

Узнайте, как найти все зарегистрированные фильтры Spring Security в приложении.

Read more

Настройте веб-приложение Spring Boot

Некоторые из наиболее полезных конфигов для приложения Spring Boot.

Read more

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

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

  1. TransactionFilter - для запуска и фиксации транзакций

  2. RequestResponseLoggingFilter - для записи запросов и ответов

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

@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 из определения класса фильтра иregister the filter using a*FilterRegistrationBean*:

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

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

    return registrationBean;
}

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

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

3. Быстрый пример

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

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

    @GetMapping()
    public List 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.

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