美文网首页
过滤器的使用以及和拦截器的区别

过滤器的使用以及和拦截器的区别

作者: 文景大大 | 来源:发表于2021-02-10 15:44 被阅读0次

    一、过滤器的使用

    过滤器Filter就是在网络请求达到处理逻辑之前对请求进行一些过滤和处理。当然我们可以在处理中加入一些想要的逻辑,从而实现一些类似AOP的功能。

    首先,我们需要创建一个Filter,需要实现servlet提供的Filter接口;

    @Slf4j
    public class PrintRequestTimeCostFilter implements Filter {
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            long requestBeginTime = System.currentTimeMillis();
            filterChain.doFilter(servletRequest,servletResponse);
            log.info("访问{}的时间耗费是{}", ((RequestFacade) servletRequest).getRequestURI(), System.currentTimeMillis() - requestBeginTime);
    
        }
    }
    

    其次,我们需要进行配置,这里采用JavaConfig的形式:

    @Configuration
    public class FilterConfig {
    
        @Bean
        public FilterRegistrationBean registerFilter(){
            FilterRegistrationBean registrationBean = new FilterRegistrationBean();
            registrationBean.setFilter(new PrintRequestTimeCostFilter());
            registrationBean.addUrlPatterns("/*");
            registrationBean.setName("PrintRequestTimeCostFilter");
            registrationBean.setOrder(1);
            return registrationBean;
        }
    
    }
    

    此时我们的过滤器Filter就已经生效了,启动程序后任意请求达到服务器都能打印出来访问耗费的时间。

    除了采用JavaConfig的方式进行过滤器的配置,我们可以基于注解直接在过滤器类上进行配置:

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

    然后在启动类上加上如下注解。

    @ServletComponentScan
    

    二、过滤器和拦截器的异同分析

    我们在先前一篇文章中《基于HandlerInterceptor的拦截器使用及实现》,我们介绍了拦截器的使用。那么过滤器和拦截器有什么异同呢?

    2.1 相同点

    • 都是AOP面向切面编程的一种实现,都可以对请求进行拦截和过滤,做一些前置操作;

    2.2 不同点

    • Filter基于servlet,原理是采用的回调机制;拦截器基于Spring,原理是采用的动态代理反射技术;
    • Filter可以对任意类型的请求进行拦截,包括静态资源等;而拦截器只能对action请求类型进行处理;
    • 拦截器可以对action请求上下文内容进行访问,但是Filter不行;

    相关文章

      网友评论

          本文标题:过滤器的使用以及和拦截器的区别

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