1. Обзор
В этом кратком руководстве мы рассмотрим, как определить пользовательские фильтры и указать порядок их вызова с помощью Spring Boot.
2. Определение фильтров и порядка вызова
Начнем с создания двух фильтров:
TransactionFilter
— для запуска и фиксации транзакций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 .