天天看点

spring boot 过滤器,拦截器Filter 过滤器Interceptor 拦截器

过滤器 Filter是依赖于Servlet容器,属于Servlet规范的一部分,

拦截器则是独立存在的,可以在任何情况下使用。

文章目录

  • Filter 过滤器
    • FilterRegistrationBean方式注册
      • 1. 实现 Filter 接口,编写过滤器
      • 2. 注册过滤器
        • FilterRegistrationBean实例 注册过滤器
        • @WebFilter注解 注册过滤器
  • Interceptor 拦截器
    • 实现 HandlerInterceptor 接口,编写拦截器
    • 注册拦截器

Filter 过滤器

  • 有2种方式可以实现过滤器
    1. 通过FilterRegistrationBean实例注册
    2. 通过@WebFilter注解生效(不能设置过滤器之间的优先级)

FilterRegistrationBean方式注册

1. 实现 Filter 接口,编写过滤器

public class Test1Filter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    
    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
            throws IOException, ServletException {
        HttpServletRequest request=(HttpServletRequest)arg0;
        System.out.println("自定义过滤器filter1触发,拦截url:"+request.getRequestURI());
        arg2.doFilter(arg0,arg1);
    }
    
    @Override
    public void destroy() {
    }
}
           

2. 注册过滤器

FilterRegistrationBean实例 注册过滤器

@Configuration
public class testFilterConfig {

    @Bean
    public FilterRegistrationBean<Test1Filter> RegistTest1(){
        
        FilterRegistrationBean<Test1Filter> bean = new FilterRegistrationBean<Test1Filter>();
        bean.setFilter(new Test1Filter());//注册自定义过滤器
        bean.setName("flilter1");//过滤器名称
        bean.addUrlPatterns("/*");//过滤所有路径
        //通过FilterRegistrationBean实例设置优先级可以生效 通过@WebFilter无效
        bean.setOrder(1);//优先级,最顶级
        return bean;
    }
}
           

@WebFilter注解 注册过滤器

直接在Test1Filter 类上加

@WebFilter(urlPatterns = "/*", filterName = "Test1Filter1")

就注册生效

  1. @WebFilter这个注解是Servlet3.0的规范,并不是Spring boot提供的
  2. @WebFilter这个注解并没有指定执行顺序的属性,其执行顺序依赖于Filter的名称,是根据Filter类名(注意不是配置的filter的名字)的字母顺序倒序排列
  3. 过滤器优先级都高于FilterRegistrationBean配置的过滤器

Interceptor 拦截器

实现 HandlerInterceptor 接口,编写拦截器

public class Test1CostInterceptor implements HandlerInterceptor {
    long start = System.currentTimeMillis();
    
    //请求执行前执行
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        System.out.println("自定义拦截器触发,请求开始");
        return true;
    }
 
 	//请求结束执行
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("自定义拦截器触发,请求结束");
    }
 
 	//视图渲染完成后执行
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
    }
}
           

注册拦截器

@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter {
 
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new Test1CostInterceptor()).addPathPatterns("/**");
        super.addInterceptors(registry);
    }
}
           

继续阅读