5分钟掌握过滤器和拦截器的区别
拦截器和过滤器是我们在工作中经常接触到的工具,那么这两者之间有什么区别呢,下面我们来整理下二者的主要区别。
1、项目中代码的实现上的不同
(1)过滤器的实现
过滤器的核心是实现Filter接口,然后重新接口的中方法达到既定的功能,如下所示:
@WebFilter(urlPatterns = "*/")
public class MyTestFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("this is init()");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
System.out.println("=======start doFilter ===============");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("=======end doFilter ==================");
}
@Override
public void destroy() {
System.out.println("=============== destroy ==========");
}
}
(2)拦截器的实现
拦截器的核心是实现HandlerInterceptor**接口,然后实现接口的中的方法来实现实际的功能。
@Component
public class MyTestInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyTestInterceptor==>preHandle " );
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
System.out.println("MyTestInterceptor==>postHandle " );
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
System.out.println("MyTestInterceptor==>afterCompletion " );
}
}
2、来源的不同
过滤器 (Filter)属于web服务器组件,它主要是过滤Servlet请求。
拦截器(Interceptor)属于框架(springMVC),它的主要作用:拦截Controller请求。
3、执行的顺序不同
当一个请求到来之后,请求先交给web服务器提供的过滤器处理,再来到servlet上,这个时候用到一个名字为Dispatcherservlet**的servlet,它就会执行,那么此时我们的Dispatcherservlet中就调用拦截器,在由Dispatcherservlet分发给controller来处理请求,请求处理完成之后就会从调用的链路原路返回。
过滤器和拦截器底层实现方式大不相同,过滤器是基于函数回调的,拦截器则是基于Java的反射机制(动态代理)实现的。
4、支持的项目类型不同
过滤器是servlet规范中定义的,所以过滤器要依赖于servlet容器,只能再web项目中;拦截器是Spring的组件,并由Spring容器管理,并不依赖Tomcat等容器,是可以单独使用的。它不仅能应用在web程序中,也可以用于Application、Swing等程序中。
5、应用的场景不同
拦截器更靠近Controler层,所以我们主要用来实现项目中的业务必要的基础设施工作,如登录判断、权限判断、业务日志记录、视图响应、请求参数处理和URL重定向等。
过滤器主要用来实现通用的功能过滤,如敏感词过滤、字符集编码设置、响应数据的压缩、身份认证与授权、接口的性能监控、跨域处理日志记录等。
当然也不是绝对的,我们可以在过滤器中做一些拦截器的功能,也可以在拦截器中实现过滤器的一些功能。
总结:
(1)原理实现上:过滤器基于回调实现,而拦截器基于动态代理。
(2)控制粒度上:过滤器和拦截器都能够实现对请求的拦截功能,但是在拦截的粒度上有较大的差异,拦截器对访问控制的粒度更细。
(3)依赖容器上:过滤器依赖于Servlet容器,局限于web,而拦截器依赖于Spring框架,能够使用Spring框架的资源,不仅限于web。
(4)执行顺序上:过滤器在Servlet前后执行,拦截器在handler前后执行。