SpringBoot中使用Filter和Interceptor

1、Filter(過濾器)

Filter接口定義在javax.servlet包中,是Servlet規範定義的,做用於Request/Response先後,被Servlet容器調用,Filter不能使用Spring容器資源。java

實現一個Filter

自定義的過濾器須要實現javax.servlet.Filter,Filter接口中有三個方法:web

  • init(FilterConfig filterConfig):過濾器初始化的被調用。spring

  • doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain):在doFilter()方法中,chain.doFilter()前的通常是對request執行的過濾操做,chain.doFilter後面的代碼通常是對response執行的操做,chain.doFiter()執行下一個過濾器或者業務處理器。bash

  • destory():過濾器銷燬的時候被調用。ide

在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的方式定義Filter,默認使用Filter的類名設置優先級。使用FilterRegistrationBean能夠指定優先級。Filter使用白名單過濾Url的方式,配置須要攔截的Url,若是想設置不過濾某些Url須要在doFilter方法中指定。post

2、Interceptor(攔截器)

定義一個Interceptor須要實現org.springframework.web.servlet.HandlerInterceptor接口,Interceptor是Spring容器定義的,它可使用Spring容器的任何資源,只要經過IoC注入到Interceptor便可,Interceptor能夠深刻到業務處理方法的執行先後和拋出異常的時候,而Filerter沒法作到這一點,因此Interceptor相比Filter具備更大的彈性。ui

實現一個Interceptor

實現HandlerInterceptor或者繼承HandlerInterceptorAdapterspa

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:在業務處理器處理請求以前被調用。3d

  • postHandle:在業務處理器處理請求後並生成視圖前被調用,此時有機會修改ModelAndView。code

  • 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("/*");
    }
}    
複製代碼

Interceptor既能夠指定要過濾的Url也能夠指定不攔截的Url,缺省狀況攔截全部Url。

3、調用順序

相關文章
相關標籤/搜索