фильтр
В этом разделе описывается, как использовать Spring Boot для реализации пользовательских фильтров.При разработке веб-проектов фильтры часто необходимы для обработки некоторых запросов, включая преобразование набора символов, фильтрацию чувствительных слов и другие сценарии.
1. Введение в фильтр
Фильтр определен в спецификации сервлета Java, который может проверять и изменять Запрос (запрос) и Ответ (возврат) перед отправкой HTTP-запроса сервлету, чтобы играть роль фильтрации. Путем фильтрации всех веб-ресурсов (таких как JSP, сервлет, статические файлы изображений или статические HTML-файлы и т. д.), управляемых веб-сервером, могут быть реализованы специальные функции, такие как контроль доступа на уровне URL-адреса, фильтрация конфиденциальных слов и исключение XSS. персонажи угроз и т.д.
Spring Boot имеет множество встроенных фильтров, таких как OrderedCharacterEncodingFilter для кодирования и HiddenHttpMethodFilter для преобразования запроса, а также поддерживает настраиваемые фильтры в соответствии с фактическими потребностями. Существует два способа реализации пользовательских фильтров: первый — использовать @WebFilter, а второй — использовать FilterRegistrationBean. После практики выяснилось, что порядок приоритетов фильтров, настроенный @WebFilter, не может действовать, поэтому рекомендуется второе решение.
Фильтры и перехватчики имеют схожие функции, но в технической реализации есть большой пробел.Различия между ними заключаются в следующих аспектах:
1) Фильтр зависит от контейнера сервлета и является частью спецификации сервлета, тогда как перехватчик существует независимо и может использоваться в любой ситуации.
2) Выполнение фильтра завершается обратным вызовом контейнера Servlet, тогда как перехватчик обычно выполняется через динамический прокси.
3) Жизненный цикл фильтра управляется контейнером сервлетов, а перехватчиком может управлять контейнер IoC, поэтому он может получать другие экземпляры Bean посредством инъекции и т. д., поэтому его более удобно использовать.
Порядок выполнения перехватчиков и фильтров: сначала фильтр, а затем перехватчик. Конкретный процесс выполнения: перед фильтрацией→перед перехватом→выполнение→после перехвата→после фильтрации.
2. Используйте FilterRegistrationBean для реализации фильтров
Spring Boot предоставляет класс FilterRegistrationBean для реализации внедрения фильтра Шаги для реализации пользовательского фильтра следующие:
1) Добавьте собственный класс Filter, реализуйте интерфейс Filter и реализуйте в нем метод doFilter().
2) Добавьте аннотацию @Configuration, чтобы добавить пользовательский фильтр в цепочку фильтров.
Далее возьмем в качестве примера мониторинг времени выполнения запроса и реализуем функцию мониторинга производительности системы через настраиваемые фильтры.
Действуйте следующим образом:
Шаг 01 Создайте перехватчик, пример кода выглядит следующим образом:
@Component
public class ConsumerTimerFilter implements Filter {
@Override
public void init(FilterConfig arg0) throws ServletException {
}
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("timer Filter begin");
long start = new Date().getTime();
chain.doFilter(request, response);
long end = new Date().getTime();
System.out.println("timer Filter end,cost time:" + (end - start));
}
}
Spring Boot гарантированно управляет аннотацией @Component. В приведенном выше примере кода реализован метод doFilter() для записи времени всех HTTP-запросов.
Шаг 02 вводит фильтр в конфигурацию системы.
Вставьте определенный фильтр ConsumerTimerFilter в систему через класс FilterRegistrationBean и настройте адрес фильтрации и последовательность выполнения. Пример кода выглядит следующим образом:
@Configuration
public class WebConfig {
@Bean
public FilterRegistrationBean consumerLoginFilterRegistration() {
FilterRegistrationBean<ConsumerLohinFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(ConsumerLoginFilter());
registration.addUrlPatterns("/*");
registration.setName("consumerLoginFilter");
registration.setOrder(2);
return registration;
}
}
Используйте Registration.setOrder(2) для сортировки, чем меньше число, тем первым выполняется. При наличии нескольких фильтров порядок их выполнения определяется установкой свойства Order.
После добавления запустите проект, введите адрес http://localhost:8080/getUsers в браузере, и вы увидите, что консоль выводит следующую информацию:
timer Filter begin
timer Filter end,cost time:17
Как показано выше, фон выводит истекшее время запроса, указывая на то, что только что настроенный фильтр отфильтровал все URL-адреса.