一、Filter(過濾器)
Filter接口定義在javax.servlet包中,是Servlet規(guī)范定義的,作用于Request/Response前后,被Servlet容器調(diào)用,當Filter被Sring管理后可以使用Spring容器資源。
實現(xiàn)一個Filter
自定義的過濾器需要實現(xiàn)javax.servlet.Filter,F(xiàn)ilter接口中有三個方法:
-
init(FilterConfig filterConfig):過濾器初始化的被調(diào)用。
-
doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain):在doFilter()方法中,chain.doFilter()前的一般是對request執(zhí)行的過濾操作,chain.doFilter后面的代碼一般是對response執(zhí)行的操作,chain.doFiter()執(zhí)行下一個過濾器或者業(yè)務(wù)處理器。
-
destory():過濾器銷毀的時候被調(diào)用。
在Spring容器中使用過濾器
通過FilterRegistrationBean
02 | public class WebConfig{ |
04 | public FilterRegistrationBean xxxFilter() { |
05 | FilterRegistrationBean registrationBean = new FilterRegistrationBean(); |
06 | registrationBean.setFilter( new xxxFilter()); |
07 | registrationBean.setUrlPatterns(Arrays.asList( "/*" )); |
08 | registrationBean.setOrder( 1 ); |
09 | return registrationBean; |
通過@WebFilter和@ServletComponentScan
通過@WebFilter的方式定義Filter,默認使用Filter的類名設(shè)置優(yōu)先級。使用FilterRegistrationBean可以指定優(yōu)先級。Filter使用白名單過濾Url的方式,配置需要攔截的Url,如果想設(shè)置不過濾某些Url需要在doFilter方法中指定。
二、Interceptor(攔截器)
定義一個Interceptor需要實現(xiàn)org.springframework.web.servlet.HandlerInterceptor接口,Interceptor是Spring容器定義的,它可以使用Spring容器的任何資源,只要通過IoC注入到Interceptor即可,Interceptor可以深入到業(yè)務(wù)處理方法的執(zhí)行前后和拋出異常的時候,而Filerter無法做到這一點,所以Interceptor相比Filter具有更大的彈性。
實現(xiàn)一個Interceptor
實現(xiàn)HandlerInterceptor或者繼承HandlerInterceptorAdapter
01 | public interface HandlerInterceptor { |
02 | default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { |
06 | default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { |
09 | default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { |
-
preHandle:在業(yè)務(wù)處理器處理請求之前被調(diào)用。
-
postHandle:在業(yè)務(wù)處理器處理請求后并生成視圖前被調(diào)用,此時有機會修改ModelAndView。
-
afterCompletion:業(yè)務(wù)處理處理器處理完請求后(已經(jīng)渲染視圖)被執(zhí)行,并可以處理業(yè)務(wù)方法發(fā)生異常的場景。
在Spring容器中使用攔截器
02 | public class WebConfig implements WebMvcConfigurer { |
05 | public void addInterceptors(InterceptorRegistry registry) { |
06 | InterceptorRegistration registration = registry.addInterceptor( new TimeInterceptor()); |
07 | registration.excludePathPatterns( "/user" ); |
08 | registration.excludePathPatterns( "/*" ); |
Interceptor既可以指定要過濾的Url也可以指定不攔截的Url,缺省情況攔截所有Url。
三、調(diào)用順序

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持服務(wù)器之家。