[Spring Boot] Веб-разработка — фильтр

фильтр

В этом разделе описывается, как использовать 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-адреса.

Guess you like

Origin blog.csdn.net/weixin_45627039/article/details/131910992