过滤器、拦截器、监听器、AOP 学习笔记

学习参考博客:
彻底搞懂过滤器、拦截器、监听器、AOP,看这一篇就足够了
基础知识还是不够扎实,参考大佬博客学习了一波。以下为学习笔记

过滤器

是sevlet 中的一种常用技术,本质上就是一个 实现了 Filter接口的 Java类。

使用步骤(springboot 环境下):
1,实现 Filter接口(javax.servlet 包下)并重写其 3个方法;

  • init() 过滤器初始化。在项目启动时加载调用;
  • doFilter() 进入过滤器时的具体操作;
  • destory() 过滤器销毁,在容器销毁(项目停止)时加载调用;

2,设置过滤器名称、及需要过滤的资源路径;
例:设置一个叫 testFilterName的过滤器,过滤拦截系统内所有资源路径;
@WebFilter(filterName = “testFilterName”, urlPatterns = “/*”)

3,需要将过滤器注入到容器内;(两种方式不可同时使用)

  • 可以在过滤器类上直接加 @Component 注解;
  • 也可以在启动类上加 @ServletComponentScan 注解;

代码实例

@Log4j2
@WebFilter(filterName = "testFilter1", urlPatterns = "/aop/hello/*")
public class TestFilter1 implements Filter {


    /**
     * 初始化过滤器1
     * @param filterConfig
     * @throws ServletException
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("初始化过滤器1");


    }


    /**
     * 进入过滤器1
     * @param servletRequest
     * @param servletResponse
     * @param filterChain
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("------进入过滤器1------");


        HttpServletResponse response = (HttpServletResponse) servletResponse;
        //模拟 过滤条件 1==1
        if(1!=1){
            responseJson(response,"当前请求不合法!");
            return;
        }
        filterChain.doFilter(servletRequest,servletResponse);
    }


    /**
     * 销毁过滤器1
     */
    @Override
    public void destroy() {
        log.info("xxxxxx销毁过滤器1xxxxxx");
    }

    /**
     * 异常 返回数据
     *
     * @param response
     * @param data
     */
    private void responseJson(HttpServletResponse response, Object data) {
        response.setContentType("application/json;charset=utf-8");
        response.setCharacterEncoding("UTF-8");
        try {
            PrintWriter writer = response.getWriter();
            // 消除对同一对象循环引用的问题,默认为false,不设置 SerializerFeature.DisableCircularReferenceDetect 数据可能会乱码
            writer.write(JSON.toJSONString(data, SerializerFeature.DisableCircularReferenceDetect));
            writer.close();
            response.flushBuffer();
        } catch (IOException e) {
            log.error("【输出 JSON 异常】,{}", e);
        }
    }
}

拓展问题:
1,设置多个过滤器的过滤顺序?
默认是按照过滤器的类名字母先后顺序,或是数字大小依次调用的。

  • web.xml 配置,谁在上面谁先执行;
  • 编写config 配置文件去加载 过滤器。重上往下顺序执行;(需要把过滤器上的@WebFilter 注解去掉了)
    例子:TestFilter3 > TestFilter1 > TestFilter2;
@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean pathFilter(){
        FilterRegistrationBean registrationBean = new FilterRegistrationBean(new TestFilter3());
        registrationBean.addUrlPatterns("/*");
        return registrationBean;
    }


    @Bean
    public FilterRegistrationBean jwtFilter(){
        FilterRegistrationBean registrationBean = new FilterRegistrationBean(new TestFilter1());
        registrationBean.addUrlPatterns("/*");
        return registrationBean;
    }


    @Bean
    public FilterRegistrationBean decodeFilter(){
        FilterRegistrationBean registrationBean = new FilterRegistrationBean(new TestFilter2());
        registrationBean.addInitParameter("", "");
        registrationBean.addUrlPatterns("/*");
        return registrationBean;
    }
}

2,多个过滤器的执行链路?
先进入的过滤器最后结束;

2022-08-31 22:26:10.044  INFO 2776 --- [nio-8088-exec-3] com.codeLead.aopDemo.filter.TestFilter3  : ------进入过滤器3---
2022-08-31 22:26:10.045  INFO 2776 --- [nio-8088-exec-3] com.codeLead.aopDemo.filter.TestFilter1  : ------进入过滤器1---
2022-08-31 22:26:10.045  INFO 2776 --- [nio-8088-exec-3] com.codeLead.aopDemo.filter.TestFilter2  : ------进入过滤器2---
调用执行了sayhello接口!
2022-08-31 22:26:10.090  INFO 2776 --- [nio-8088-exec-3] com.codeLead.aopDemo.filter.TestFilter2  : --离开过滤器2--共耗时:45
2022-08-31 22:26:10.091  INFO 2776 --- [nio-8088-exec-3] com.codeLead.aopDemo.filter.TestFilter1  : --离开过滤器1--共耗时:46
2022-08-31 22:26:10.091  INFO 2776 --- [nio-8088-exec-3] com.codeLead.aopDemo.filter.TestFilter3  : --离开过滤器3--共耗时:47

拦截器

是spring里的一种技术,功能与拦截器类似,但是标准和实现不同。

使用场景:

  • 登录认证:使用拦截器验证用户登录状态,如果没有登录或是登录失败,给用户进行返回提示;
  • 记录系统日志:记录用户的操作情况,请求IP,方法执行时间等,对系统运行情况进行监控;

实现步骤:
1,需要实现 HandlerInterceptor 接口,及重写其内部3个方法;

  • preHandle() : 在 controller 处理请求之前被调用,
  • postHandle():在 controller 处理请求完成后、生成视图前被调用;
  • afterCompletion():在DispatcherServlet 完全处理请求后被调用,通常用于记录消耗时间,也可以对一些资源进行处理;
/**
* 拦截器1
*/
@Log4j2
@Component
public class Interceptor1 implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        long l = System.currentTimeMillis();
        log.info("--拦截器1 请求执行前处理 开始--");

        log.info("--拦截器1 请求执行前处理 结束共耗时:"+(System.currentTimeMillis()-l));
        return true;
    }


    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        long l = System.currentTimeMillis();
        log.info("--拦截器1 请求完成后处理 开始--");

        log.info("--拦截器1 请求完成后处理 结束共耗时:"+(System.currentTimeMillis()-l));
    }


    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        long l = System.currentTimeMillis();
        log.info("--拦截器1 视图渲染完成后处理 开始--");

        log.info("--拦截器1 视图渲染完成后处理 结束共耗时:"+(System.currentTimeMillis()-l));
    }
}

2,使用配置类注册拦截器;

/**
* 拦截器配置类
*/
@Configuration
public class InterceptorConf implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        /**
         * 配置拦截器1
         */
        Interceptor1 interceptor1 = new Interceptor1();
        registry.addInterceptor(interceptor1)
                //设置拦截的路径(所有)
                .addPathPatterns("/**")
                //设置放行的路径
                .excludePathPatterns("/aop/hello/**");
    }
}

拓展问题:

  • 配置多个拦截器、设置多个拦截器的执行顺序
    配置类中添加多个拦截器
/**
* 拦截器配置类
*/
@Configuration
public class InterceptorConf implements WebMvcConfigurer {


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        /**
         * 配置拦截器1
         */
        Interceptor1 interceptor1 = new Interceptor1();
        registry.addInterceptor(interceptor1)
                //设置拦截的路径(所有)
                .addPathPatterns("/**")
                //设置放行的路径
                .excludePathPatterns("/aop/hello/**")
                //设置多个拦截器的执行顺序(序号越小越先执行)
                .order(1);


        /**
         * 配置拦截器2
         */
        Interceptor2 interceptor2 = new Interceptor2();
        registry.addInterceptor(interceptor2)
                //设置拦截的路径(所有)
                .addPathPatterns("/**")
                //设置放行的路径
                .excludePathPatterns("/aop/hello/**")
                //设置多个拦截器的执行顺序(序号越小越先执行)
                .order(0);


        /**
         * 配置拦截器3
         */
        Interceptor3 interceptor3 = new Interceptor3();
        registry.addInterceptor(interceptor3)
                //设置拦截的路径(所有)
                .addPathPatterns("/**")
                //设置放行的路径
                .excludePathPatterns("/aop/hello/**")
                //设置多个拦截器的执行顺序(序号越小越先执行)
                .order(2);


    }
}
  • 拦截器的执行链路(拦截器与过滤器在一起的执行链路)
    进入过滤器 -> 进入请求执行前处理 -> 进入请求完成后处理 -> 进入视图渲染完成后处理 ->离开过滤器
2022-09-01 21:36:23.460  INFO 13120 --- [nio-8088-exec-1] com.codeLead.aopDemo.filter.TestFilter3  : ------进入过滤器3------
2022-09-01 21:36:23.460  INFO 13120 --- [nio-8088-exec-1] com.codeLead.aopDemo.filter.TestFilter1  : ------进入过滤器1------
2022-09-01 21:36:23.460  INFO 13120 --- [nio-8088-exec-1] com.codeLead.aopDemo.filter.TestFilter2  : ------进入过滤器2------
2022-09-01 21:36:23.469  INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor2     : --拦截器2 请求执行前处理 开始--
2022-09-01 21:36:23.469  INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor2     : --拦截器2 请求执行前处理 结束共耗时:0
2022-09-01 21:36:23.469  INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor1     : --拦截器1 请求执行前处理 开始--
2022-09-01 21:36:23.470  INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor1     : --拦截器1 请求执行前处理 结束共耗时:1
2022-09-01 21:36:23.470  INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor3     : --拦截器3 请求执行前处理 开始--
2022-09-01 21:36:23.470  INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor3     : --拦截器3 请求执行前处理 结束共耗时:0
执行bye方法!
2022-09-01 21:36:35.667  INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor3     : --拦截器3 请求完成后处理 开始--
2022-09-01 21:36:35.667  INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor3     : --拦截器3 请求完成后处理 结束共耗时:0
2022-09-01 21:36:35.667  INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor1     : --拦截器1 请求完成后处理 开始--
2022-09-01 21:36:35.667  INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor1     : --拦截器1 请求完成后处理 结束共耗时:0
2022-09-01 21:36:35.667  INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor2     : --拦截器2 请求完成后处理 开始--
2022-09-01 21:36:35.667  INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor2     : --拦截器2 请求完成后处理 结束共耗时:0
2022-09-01 21:36:35.667  INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor3     : --拦截器3 视图渲染完成后处理 开始--
2022-09-01 21:36:35.667  INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor3     : --拦截器3 视图渲染完成后处理 结束共耗时:0
2022-09-01 21:36:35.667  INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor1     : --拦截器1 视图渲染完成后处理 开始--
2022-09-01 21:36:35.667  INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor1     : --拦截器1 视图渲染完成后处理 结束共耗时:0
2022-09-01 21:36:35.668  INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor2     : --拦截器2 视图渲染完成后处理 开始--
2022-09-01 21:36:35.668  INFO 13120 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor2     : --拦截器2 视图渲染完成后处理 结束共耗时:0
2022-09-01 21:36:35.669  INFO 13120 --- [nio-8088-exec-1] com.codeLead.aopDemo.filter.TestFilter2  : ------离开过滤器2------共耗时:12209
2022-09-01 21:36:35.669  INFO 13120 --- [nio-8088-exec-1] com.codeLead.aopDemo.filter.TestFilter1  : ------离开过滤器1------共耗时:12209
2022-09-01 21:36:35.669  INFO 13120 --- [nio-8088-exec-1] com.codeLead.aopDemo.filter.TestFilter3  : ------离开过滤器3------共耗时:12209

监听器

JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext、HttpSession和 ServletRequest这三大域对象的创建、销毁事件以及监听这些域对象中的属性发生修改的事件。

使用场景:
可以通过 HttpSessionListener来统计当前在线人数、ip等信息;

监听器种类(部分):

  • ServletRequestListener
    对Request 对象进行监听;(所有接口请求都会进入)
@Component
@Log4j2
public class MyServletRequestListener implements ServletRequestListener {

    //请求结束时调用
    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        log.info("xx Request 监听器被销毁xx");

    }
    //请求开始时被调用
    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        log.info("--Request 监听器被调用--");
    }
}
  • HttpSessionListener
    对 HttpSession 生命周期进行监听;(如果在请求的方法中 获取或者使用了session对象,那么则会进入!)
    ps:在业务代码中 获得 session 对象的方式;
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
HttpSession session = request.getSession();
@Log4j2
@Component
public class MyHttpSessionListener implements HttpSessionListener {

    public static AtomicInteger userCount = new AtomicInteger(0);

    //会话产生时调用
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        int andIncrement = userCount.getAndIncrement();
        int i = userCount.get();
        se.getSession().getServletContext().setAttribute("sessionCount", i);
        int i1 = userCount.get();
        log.info("【在线人数】人数增加为:{}",i1);

        //此处可以在ServletContext域对象中为访问量计数,然后传入过滤器的销毁方法
        //在销毁方法中调用数据库入库,因为过滤器生命周期与容器一致
    }

    //会话关闭时调用
    @Override
    public synchronized void sessionDestroyed(HttpSessionEvent se) {
        userCount.getAndDecrement();
        se.getSession().getServletContext().setAttribute("sessionCount", userCount.get());
        log.info("【在线人数】人数减少为:{}",userCount.get());
    }
}
  • ServletContextListener
    对 ServletContext 生命周期进行监听;(在项目启动或是关闭时会进入对应方法)
@Component
@Log4j2
public class MyServletContextListener implements ServletContextListener {

    //项目启动时调用
    @Override
    public void contextInitialized(ServletContextEvent sce) {

        log.info("-- Servlet 上下文监听器被调用初始化 --");

    }
    
    //项目关闭时调用
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        log.info("xxServlet 上下文监听器被调用销毁xx");
    }
}

拓展问题:

  • 监听器的执行链路(拦截器、过滤器、监听器在一起的执行链路)
    监听器被调用 -> 过滤器 -> 拦截器 -> 监听器被销毁
2022-09-02 00:05:39.468  INFO 18060 --- [nio-8088-exec-1] c.c.a.listener.MyServletRequestListener  : --Request 监听器被调用--
2022-09-02 00:05:39.474  INFO 18060 --- [nio-8088-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2022-09-02 00:05:39.474  INFO 18060 --- [nio-8088-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2022-09-02 00:05:39.475  INFO 18060 --- [nio-8088-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms
2022-09-02 00:05:39.480  INFO 18060 --- [nio-8088-exec-1] com.codeLead.aopDemo.filter.TestFilter3  : ------进入过滤器3------
2022-09-02 00:05:39.481  INFO 18060 --- [nio-8088-exec-1] com.codeLead.aopDemo.filter.TestFilter1  : ------进入过滤器1------
2022-09-02 00:05:39.481  INFO 18060 --- [nio-8088-exec-1] com.codeLead.aopDemo.filter.TestFilter2  : ------进入过滤器2------
2022-09-02 00:05:39.491  INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor2     : --拦截器2 请求执行前处理 开始--
2022-09-02 00:05:39.491  INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor2     : --拦截器2 请求执行前处理 结束共耗时:0
2022-09-02 00:05:39.491  INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor1     : --拦截器1 请求执行前处理 开始--
2022-09-02 00:05:39.491  INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor1     : --拦截器1 请求执行前处理 结束共耗时:0
2022-09-02 00:05:39.491  INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor3     : --拦截器3 请求执行前处理 开始--
2022-09-02 00:05:39.491  INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor3     : --拦截器3 请求执行前处理 结束共耗时:0
执行bye方法!
2022-09-02 00:05:39.516  INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor3     : --拦截器3 请求完成后处理 开始--
2022-09-02 00:05:39.516  INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor3     : --拦截器3 请求完成后处理 结束共耗时:1
2022-09-02 00:05:39.516  INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor1     : --拦截器1 请求完成后处理 开始--
2022-09-02 00:05:39.516  INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor1     : --拦截器1 请求完成后处理 结束共耗时:0
2022-09-02 00:05:39.516  INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor2     : --拦截器2 请求完成后处理 开始--
2022-09-02 00:05:39.516  INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor2     : --拦截器2 请求完成后处理 结束共耗时:0
2022-09-02 00:05:39.516  INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor3     : --拦截器3 视图渲染完成后处理 开始--
2022-09-02 00:05:39.516  INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor3     : --拦截器3 视图渲染完成后处理 结束共耗时:0
2022-09-02 00:05:39.516  INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor1     : --拦截器1 视图渲染完成后处理 开始--
2022-09-02 00:05:39.516  INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor1     : --拦截器1 视图渲染完成后处理 结束共耗时:0
2022-09-02 00:05:39.516  INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor2     : --拦截器2 视图渲染完成后处理 开始--
2022-09-02 00:05:39.516  INFO 18060 --- [nio-8088-exec-1] c.c.aopDemo.interceptor.Interceptor2     : --拦截器2 视图渲染完成后处理 结束共耗时:0
2022-09-02 00:05:39.517  INFO 18060 --- [nio-8088-exec-1] com.codeLead.aopDemo.filter.TestFilter2  : ------离开过滤器2------共耗时:36
2022-09-02 00:05:39.518  INFO 18060 --- [nio-8088-exec-1] com.codeLead.aopDemo.filter.TestFilter1  : ------离开过滤器1------共耗时:37
2022-09-02 00:05:39.518  INFO 18060 --- [nio-8088-exec-1] com.codeLead.aopDemo.filter.TestFilter3  : ------离开过滤器3------共耗时:38
2022-09-02 00:05:39.518  INFO 18060 --- [nio-8088-exec-1] c.c.a.listener.MyServletRequestListener  : xx Request 监听器被销毁xx

AOP

AOP 称为面向切面编程,在程序开发中主要用来解决一些系统层面上的公共部分的问题,在不改变原有的逻辑的基础上,增加一些额外的功能,比如日志,事务,权限等等;

相关概念:
切面:即定义的切面类,类里面可以定义切点,和通知,使用 @Aspect 注解表名当前类是一个切面类;
切点:定义一个方法(一般为空方法),使用 @Pointcut 注解表示当前方法是一个切点。需要在注解的execution 内使用表达式注明要切入的指定路径、方法;
增强(通知):定义一个方法,使用需要的增强方式注解,有前置增强、后置增强、环绕增强等,即切入到某个切点(方法)后需要做的事情;

  • @Before 前置增强: 在目标方法被调用之前做增强处理,
  • @After 后置增强: 在目标方法调用之后的增强处理;
  • @Around 环绕增强: 可以在目标方法调用前后分别做处理
@Aspect
@Component
@Log4j2
public class TestAspect1 {

    /**
     * 要验证的:
     * 1,验证拦截所有方法;
     * 2,分别验证 2个增强的参数 JoinPoint ProceedingJoinPoint
     * 3,验证拦截指定的方法;
     * 4,验证拦截 包含指定参数的方法
     * ..
     *
     */

    /**
     * 表达式含义:
     * 第一个* 的位置,代表返回值类型,中间是空格连接; * 表示所有返回值类型
     * 第二个* 的位置,代表包路径,中间是 .连接; * 表示所有路径
     * 第三个* 的位置,代表方法名 ;* 表示所有方法
     * 括号内代表的是参数(..); (..)表示任何参数
     *
     * 切入所有返回值类型、所有路径下的、不限制参数的所有方法;
     */
    @Pointcut("execution(public * com.codeLead.aopDemo.controller.ByeController.*(..))")
    public void point1(){};




//    @Pointcut()
    public void point2(){};


    /**
     * 前置增强
     */
    @Before("point1()")
    public void before(JoinPoint joinPoint){
        log.info("--这里是前置增强为方法"+joinPoint.getSignature().getName()+"--进行增强!");
    }


    @After("point1()")
    public void after(JoinPoint joinPoint){
        log.info("--这里是后置增强为方法"+joinPoint.getSignature().getName()+"--进行增强!");
    }


    @Around("point1()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        log.info("--这里是环绕增强,方法执行前--");
        Object proceed = proceedingJoinPoint.proceed();
        log.info("--这里是环绕增强,方法执行后--");
        return proceed;
    }
}

拓展问题:

  • AOP的执行链路(AOP,拦截器、过滤器、监听器在一起的执行链路)
    依次执行 监听器 -> 过滤器 ->拦截器 ->AOP
2022-09-02 23:56:43.912  INFO 11404 --- [nio-8088-exec-2] c.c.a.listener.MyServletRequestListener  : --Request 监听器被调用--
2022-09-02 23:56:43.913  INFO 11404 --- [nio-8088-exec-2] com.codeLead.aopDemo.filter.TestFilter3  : ------进入过滤器3------
2022-09-02 23:56:43.913  INFO 11404 --- [nio-8088-exec-2] com.codeLead.aopDemo.filter.TestFilter1  : ------进入过滤器1------
2022-09-02 23:56:43.913  INFO 11404 --- [nio-8088-exec-2] com.codeLead.aopDemo.filter.TestFilter2  : ------进入过滤器2------
2022-09-02 23:56:43.914  INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor2     : --拦截器2 请求执行前处理 开始--
2022-09-02 23:56:43.914  INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor2     : --拦截器2 请求执行前处理 结束共耗时:0
2022-09-02 23:56:43.914  INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor1     : --拦截器1 请求执行前处理 开始--
2022-09-02 23:56:43.914  INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor1     : --拦截器1 请求执行前处理 结束共耗时:0
2022-09-02 23:56:43.914  INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor3     : --拦截器3 请求执行前处理 开始--
2022-09-02 23:56:43.914  INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor3     : --拦截器3 请求执行前处理 结束共耗时:0
2022-09-02 23:56:43.914  INFO 11404 --- [nio-8088-exec-2] com.codeLead.aopDemo.aop.TestAspect1     : --这里是环绕增强,方法执行前--
执行bye方法!
2022-09-02 23:58:17.704  INFO 11404 --- [nio-8088-exec-2] com.codeLead.aopDemo.aop.TestAspect1     : --这里是环绕增强,方法执行后--
2022-09-02 23:58:17.706  INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor3     : --拦截器3 请求完成后处理 开始--
2022-09-02 23:58:17.706  INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor3     : --拦截器3 请求完成后处理 结束共耗时:0
2022-09-02 23:58:17.707  INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor1     : --拦截器1 请求完成后处理 开始--
2022-09-02 23:58:17.707  INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor1     : --拦截器1 请求完成后处理 结束共耗时:0
2022-09-02 23:58:17.707  INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor2     : --拦截器2 请求完成后处理 开始--
2022-09-02 23:58:17.707  INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor2     : --拦截器2 请求完成后处理 结束共耗时:0
2022-09-02 23:58:17.707  INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor3     : --拦截器3 视图渲染完成后处理 开始--
2022-09-02 23:58:17.707  INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor3     : --拦截器3 视图渲染完成后处理 结束共耗时:0
2022-09-02 23:58:17.707  INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor1     : --拦截器1 视图渲染完成后处理 开始--
2022-09-02 23:58:17.707  INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor1     : --拦截器1 视图渲染完成后处理 结束共耗时:0
2022-09-02 23:58:17.707  INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor2     : --拦截器2 视图渲染完成后处理 开始--
2022-09-02 23:58:17.707  INFO 11404 --- [nio-8088-exec-2] c.c.aopDemo.interceptor.Interceptor2     : --拦截器2 视图渲染完成后处理 结束共耗时:0
2022-09-02 23:58:17.708  INFO 11404 --- [nio-8088-exec-2] com.codeLead.aopDemo.filter.TestFilter2  : ------离开过滤器2------共耗时:93795
2022-09-02 23:58:17.708  INFO 11404 --- [nio-8088-exec-2] com.codeLead.aopDemo.filter.TestFilter1  : ------离开过滤器1------共耗时:93795
2022-09-02 23:58:17.708  INFO 11404 --- [nio-8088-exec-2] com.codeLead.aopDemo.filter.TestFilter3  : ------离开过滤器3------共耗时:93795
2022-09-02 23:58:17.708  INFO 11404 --- [nio-8088-exec-2] c.c.a.listener.MyServletRequestListener  : xx Request 监听器被销毁xx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值