美文网首页
spring boot 拦截器和过滤器

spring boot 拦截器和过滤器

作者: 东南枝下 | 来源:发表于2021-12-01 15:22 被阅读0次

    过滤器 Filter

    1.实现javax.servlet.Filter

    public class ZzsTestFilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            Filter.super.init(filterConfig);
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            long start = System.currentTimeMillis();
            filterChain.doFilter(servletRequest,servletResponse);
            System.out.println("Execute cost="+(System.currentTimeMillis()-start));
        }
    
        @Override
        public void destroy() {
            Filter.super.destroy();
        }
    }
    

    2、配置类

    @Configuration
    public class ZzsFielterConfig {
    
        @Bean
        public FilterRegistrationBean registFilter() {
            FilterRegistrationBean registration = new FilterRegistrationBean();
            registration.setFilter(new ZzsTestFilter());
            registration.addUrlPatterns("/*");
            registration.setName("zzsTestFilter");
            registration.setOrder(1);
            return registration;
        }
    
    }
    
    

    3、第二步的配置类也可以用注解 @WebFilter. (实际上这种我测了没效果)

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

    但这种方式需要在启动类里加扫描注解@ServletComponentScan

    @ServletComponentScan("com.pandy.blog.filters")
    

    拦截器

    1、继承、重写

    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class ZzsTestInterceptor implements HandlerInterceptor {
        long start = System.currentTimeMillis();
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            start = System.currentTimeMillis();
            return HandlerInterceptor.super.preHandle(request, response, handler);
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("Interceptor cost="+(System.currentTimeMillis()-start));
            HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
        }
    }
    

    2、重写配置类

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

    但是 WebMvcConfigurerAdapter 弃用了

    图片.png

    参考转载自文章:https://www.cnblogs.com/paddix/p/8365558.html

    过滤器和拦截器的区别

    1、过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。

    2、拦截器可以获取IOC容器中的各个bean,而过滤器就不行,因为拦截器是spring提供并管理的,spring的功能可以被拦截器使用,在拦截器里注入一个service,可以调用业务逻辑。而过滤器是JavaEE标准,只需依赖servlet api ,不需要依赖spring。

    3、过滤器的实现基于回调函数。而拦截器(代理模式)的实现基于反射

    4、Filter是依赖于Servlet容器,属于Servlet规范的一部分,而拦截器则是独立存在的,可以在任何情况下使用。

    5、Filter的执行由Servlet容器回调完成,而拦截器通常通过动态代理(反射)的方式来执行。

    6、Filter的生命周期由Servlet容器管理,而拦截器则可以通过IoC容器来管理,因此可以通过注入等方式来获取其他Bean的实例,因此使用会更方便。

    参考转载自文章:https://www.cnblogs.com/AIPAOJIAO/p/14017338.html

    相关文章

      网友评论

          本文标题:spring boot 拦截器和过滤器

          本文链接:https://www.haomeiwen.com/subject/czysxrtx.html