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