过滤器,拦截器,AOP之间比较
一、过滤器(Filter)
1.Filter的概述
package javax.servlet;
import java.io.IOException;
public interface Filter {
default void init(FilterConfig filterConfig) throws ServletException {
}
void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
default void destroy() {
}
}
由包名可知,过滤器是属于servlet包下的,而servlet是属于web项目中的,因此,可以知道,其实Filter是只能用于web程序。
什么是过滤器?
像它的名字一样,过滤器是过滤的,那么过滤什么,它是过滤web请求的,他将所有的请求拦下来,可以修改请求中的request,以及相应的response(也就是过滤器可以拿到request和response这两个对象),我们可以在其中修改实现我们的一些需求(如根据编码格式等),这样就不用在每一个servlet中去修改,达到了一个统一配置的效果,一般使用过程中,可能出现多个过滤器组成的过滤器链(如Spring security的过滤器链)
过滤器的执行流程:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lEM1GQkE-1615132770347)(C:\Users\kyg\Desktop\博客图片\过滤器执行流程.png)]
由图中可以得知,如果成功通过过滤器,doFilter()方法会执行两次,一次是request,一次是response。
二、拦截器(Interceptor)
package org.springframework.web.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.lang.Nullable;
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
拦截器拦截的也是请求,但是它和过滤器不同的是,它属于 org.springframework.web.servlet;包,这是srping中的包,它依赖于spirng,意味这它可以获取到spring ioc容器中的bean,如其他的service等,而过滤器是不能的。
拦截器,是基于Java反射机制实现,的,它也可以拦截请求,但是它只能拦截controller中的请求,对其他的静态资源请求做不到拦截,这也是和过滤器的区别之一,但是它可以做到更加全面的拦截,可以在controller前拦截做处理,可以在controller后拦截做处理等等,而过滤器只能做一下的拦截处理。同样,也是可以存在多个拦截器的。
单个拦截器执行流程:
当perHandle()方法返回为true是,继续执行,否则后续不执行。
多个拦截器执行流程:
参考链接
三、AOP(面向切面编程)
它相对于前面两者,只对请求的拦截处理,它可以针对某个方法及其元数据(也就是方法的参数,返回值等)进行连接,显然,它的功能超级强大。我们可以将通用的代码,像是事务控制中的事务提交,事务开启,提交事务等变成一个前面,随插随用,减少代码的重复。Aop也是spring的两大核心之一。
四、过滤器,拦截器,AOP的比较
1.三者的执行顺序:
依次是过滤器(系统级别),拦截器,最后是AOP(方法级别)
2.三者的区别:
- 使用范围不同,过滤器仅限于web程序,而拦截器和AOP都依赖于spring,但不局限于web
- 过滤器不能使用spring中的bean,但是拦截器可以,AOP更不用说
-
拦截器只能对controller的请求做拦截,对其他静态资源的请求不能拦截,而过滤器拦截所有请求,AOP不是这个级别的。
spring中的bean,但是拦截器可以,AOP更不用说
- 拦截器只能对controller的请求做拦截,对其他静态资源的请求不能拦截,而过滤器拦截所有请求,AOP不是这个级别的。
- AOP的拦截的粒度很细,所以相对其他二者,实现的逻辑根据复杂,也就是三者的拦截粒度和深度不一致。