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-адреса.