Использование фильтра и перехватчика в SpringBoot

Spring Boot

1. Фильтр (фильтр)

Интерфейс фильтра определен вjavax.servletВ пакете он определяется спецификацией сервлета.Он вызывается контейнером сервлетов до и после запроса/ответа.Когда фильтр управляется Spring, можно использовать ресурсы контейнера Spring.

Реализовать фильтр

Пользовательские фильтры должны быть реализованыjavax.servlet.Filter, в интерфейсе Filter есть три метода:

  • init(FilterConfig filterConfig): Вызывается инициализация фильтра.

  • doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain):существуетdoFilter()метод,chain.doFilter()Первый обычно представляет собой операцию фильтрации, выполняемую по запросу,chain.doFilterСледующий код обычно представляет собой операцию, выполняемую над ответом,chain.doFiter()Выполнить следующий фильтр или бизнес-обработчик.

  • destory(): Вызывается при уничтожении фильтра.

Использование фильтров в контейнерах Spring

  • через FilterRegistrationBean
 @Configuration
 public class WebConfig{
    @Bean
    public FilterRegistrationBean xxxFilter() {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(new xxxFilter());
        registrationBean.setUrlPatterns(Arrays.asList("/*"));
        registrationBean.setOrder(1); // 过滤器的优先级
        return registrationBean;
    }
}    
  • пройти через@WebFilterи@ServletComponentScan

пройти через@WebFilterСпособ определения фильтра, по умолчанию имя класса фильтра используется для установки приоритета. использоватьFilterRegistrationBeanМожно указать приоритет. Фильтр использует белый список для фильтрации URL-адресов и настраивает URL-адреса, которые необходимо перехватывать. Если вы хотите отключить фильтрацию определенных URL-адресов, вам необходимоdoFilterуказан метод.

2. Перехватчик

Определение перехватчика должно быть реализованоorg.springframework.web.servlet.HandlerInterceptorИнтерфейс, перехватчик определяется контейнером Spring. Он может использовать любые ресурсы контейнера Spring. Пока он внедряется в перехватчик через IoC, перехватчик может углубляться в выполнение метода бизнес-обработки и при возникновении исключения брошенный, в то время как Filerter не может этого сделать. Точка, поэтому у Interceptor больше гибкости, чем у Filter.

Реализовать перехватчик

выполнитьHandlerInterceptorили унаследоватьHandlerInterceptorAdapter

public interface HandlerInterceptor {
   default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
       return true;
   }

   default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
   }

   default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
   }
}
  • preHandle: вызывается до того, как бизнес-обработчик обработает запрос.

  • postHandle: вызывается после того, как бизнес-процессор обработает запрос и перед созданием представления, и имеет возможность изменить ModelAndView.

  • afterCompletion: после того, как процессор обработки бизнес-процессов обработает запрос (представление будет обработано), он будет выполнен и сможет обработать сценарий, в котором в бизнес-методе возникает исключение.

Использование перехватчиков в контейнерах Spring

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        InterceptorRegistration registration = registry.addInterceptor(new TimeInterceptor());
        registration.excludePathPatterns("/user");
        registration.excludePathPatterns("/*");
    }
}    

Перехватчик может указать либо фильтруемый URL-адрес, либо URL-адрес, который не следует перехватывать.По умолчанию перехватываются все URL-адреса.

3. Последовательность вызова