天天看点

过滤器,拦截器,AOP之间比较

过滤器,拦截器,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后拦截做处理等等,而过滤器只能做一下的拦截处理。同样,也是可以存在多个拦截器的。

单个拦截器执行流程:

过滤器,拦截器,AOP之间比较

当perHandle()方法返回为true是,继续执行,否则后续不执行。

多个拦截器执行流程:

参考链接

过滤器,拦截器,AOP之间比较

三、AOP(面向切面编程)

它相对于前面两者,只对请求的拦截处理,它可以针对某个方法及其元数据(也就是方法的参数,返回值等)进行连接,显然,它的功能超级强大。我们可以将通用的代码,像是事务控制中的事务提交,事务开启,提交事务等变成一个前面,随插随用,减少代码的重复。Aop也是spring的两大核心之一。

四、过滤器,拦截器,AOP的比较

1.三者的执行顺序:

依次是过滤器(系统级别),拦截器,最后是AOP(方法级别)

2.三者的区别:
  • 使用范围不同,过滤器仅限于web程序,而拦截器和AOP都依赖于spring,但不局限于web
  • 过滤器不能使用spring中的bean,但是拦截器可以,AOP更不用说
  • 拦截器只能对controller的请求做拦截,对其他静态资源的请求不能拦截,而过滤器拦截所有请求,AOP不是这个级别的。

    spring中的bean,但是拦截器可以,AOP更不用说

  • 拦截器只能对controller的请求做拦截,对其他静态资源的请求不能拦截,而过滤器拦截所有请求,AOP不是这个级别的。
  • AOP的拦截的粒度很细,所以相对其他二者,实现的逻辑根据复杂,也就是三者的拦截粒度和深度不一致。