一、过滤器的使用
过滤器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不行;
网友评论