首页 > 其他分享 >过滤器、拦截器、AOP、ControllerAdvcie执行顺序对比

过滤器、拦截器、AOP、ControllerAdvcie执行顺序对比

时间:2024-08-10 16:38:46浏览次数:16  
标签:拦截器 AOP springframework org ControllerAdvcie import public

过滤器、拦截器、AOP、ControllerAdvcie执行顺序对比

0. 执行顺序

过滤器 ➡ 拦截器 ➡ AOP ➡ ControllerAdvice ➡ Controller

执行顺序

没有异常的情况下,执行顺序如下:
没有异常

有异常的情况下,执行顺序如下:
有异常

tip: 当产生异常后,无论是否有ControllerAdvice处理,HandlerInterceptor都不会执行postHandle方法, 直接执行afterCompletion方法。

1. 过滤器

过滤器是Servlet规范中的一部分,它依赖于Servlet容器,因此只能在web程序中使用。过滤器可以拦截到客户端发送的请求和服务器响应的内容,对它们进行过滤处理,比如实现URL级别的权限控制、过滤敏感词汇、压缩响应信息等。

通过filterChain.doFilter(req, resp);可以看出Filter是基于责任链模式的。

package com.licw.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import java.io.IOException;

@Slf4j
@Component
public class WebFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {
        log.info("filter: before");
        filterChain.doFilter(req, resp);
        log.info("filter: after");
    }
}

2. 拦截器

拦截器是依赖于Spring框架的,因此只能在Spring MVC中使用。拦截器是基于代理实现的。

// 拦截器
package com.licw.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("all")
@Slf4j
@Component
public class WebInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {
        log.info("interceptor: before");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest req, HttpServletResponse resp, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("interceptor: after");
    }

    @Override
    public void afterCompletion(HttpServletRequest req, HttpServletResponse resp, Object handler, Exception ex) throws Exception {
        log.info("interceptor: after completion");
    }
}
// 配置拦截器
package com.licw.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
 
 @Override
 public void addInterceptors(InterceptorRegistry registry) {
  registry.addInterceptor(new WebInterceptor())
    .addPathPatterns("/**");
 }
 
}

3. AOP

AOP是面向切面编程,它可以在不修改源代码的情况下,通过动态代理的方式,在方法调用前后执行一些操作。AOP可以用于实现日志记录、事务管理、权限控制等功能。

// AOP
package com.licw.config;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Slf4j
@Aspect
@Component
public class WebAop {
    @Around("execution(* com.licw.controller.BasicController.*(..))")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        log.info("aop: before");
        try {
            return proceedingJoinPoint.proceed();
        } finally {
            log.info("aop: after");
        }
    }

}

4. ControllerAdvice

ControllerAdvice是Spring MVC提供的一种全局异常处理机制,它可以定义在全局范围内处理Controller中的异常。ControllerAdvice是依赖于Spring MVC的,因此只能在Spring MVC中使用。

package com.licw.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@Slf4j
@RestControllerAdvice
public class ExceptionAdvice {

    @ExceptionHandler(Exception.class)
    public String allExceptionHandler(Exception e) {
        log.info("RestControllerAdvice: {}", e.getMessage());
        return "系统异常,请稍后再试";
    }

}

标签:拦截器,AOP,springframework,org,ControllerAdvcie,import,public
From: https://www.cnblogs.com/licwuu/p/18352459

相关文章

  • Spring源码系列六:AOP
    更多请关注:https://t.zsxq.com/fhroW文章目录ProxyFactory使用ProxyFactoryAdviceThrowsAdviceMethodInterceptorAdvisor通过spring产生代理对象TargetSourceSpringAop创建流程判断ProxyFactory使用JDK代理还是CGLIB代理拓展ProxyFactoryProxyFactory是Sprin......
  • AOP -面向切面编程
    AOP-面向切面编程aop是oop(面向对象编程)的补充和完善。oop是一种纵向开发,然而当面对需要一些横向的功能如日志,就会导致大量重复的代码。aop利用横切把一些重复的非核心的代码插入到核心代码周围,不需要重复写很多遍。应用场景:日志记录,在方法的执行前后插入日志功能事务处......
  • Java设计模式和AOP编程
    Java六大设计原则;Java23种设计模式(在此介绍三种设计模式)Java设计模式单例模式应用场景:spring中bean的作用域用的就是单例模式//基本的单例模式————懒汉式publicclassstudent{//3.创建static修饰的成员变量privatestaticstudentstu;//1.设计私......
  • AOP切面编程
    AOP切面编程一些知识切面:处理共同逻辑的模块@Aspect 用在类上,表示这个类是一个切面目标:被切面作用的业务模块切入点:用于指定那些切面作用于哪些目标组件上,一般用表达式实现。通知:切面和切入点的执行循序;分为:前置通知,后置通知,最终通知,环绕通知,异常通知前置通知(BeforeAdvic......
  • Spring AOP:面向切面编程的最佳实践 ( 一 )
    1.AOP思想1.1.为什么需要面向切面编程如果在一个类或者多个类的多个业务逻辑方法中,在开始,结尾部分包含功能相同的代码称之为横切关注点也叫切面,这种结构可能符合传统的面向对象编程(OOP)的封装特性,但可能导致代码难以维护和扩展。面向切面编程是一种编程范式。它允......
  • AI 大模型时代呼唤新一代基础设施,DataOps 2.0和调度编排愈发重要
    在AI时代,DataOps2.0代表了一种全新的数据管理和操作模式,通过自动化数据管道、实时数据处理和跨团队协作,DataOps2.0能够加速数据分析和决策过程。它融合了人工智能和机器学习技术,使得数据的获取、清洗和分析更加高效,推动企业在快速变化的市场中保持竞争优势。另一方面,在AI......
  • 登录相关功能的优化【JWT令牌+拦截器+跨域】
    登录相关功能的优化登录后显示当前登录用户el-dropdown: Element-Theworld'smostpopularVueUIframework<el-dropdownstyle="float:right;height:60px;line-height:60px"><spanclass="el-dropdown-link"style="color:white;font-siz......
  • Spring IOC 和 AOP
    SpringIOC 控制反转(IOC):SpringBean对象统一创建交给IOC容器管理,来实现对象之间的解耦依赖注入(DI):构造器注入、setter方法注入、根据注解注入SpringAOPAOP的实现关键在于代理模式,主要分为静态代理和动态代理静态代理的代表为AspectJ,动态代理以SpringAOP为......
  • Spring AOP:面向切面编程的核心概念与实际应用
    SpringAOP:面向切面编程的核心概念与实际应用大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!SpringAOP(Aspect-OrientedProgramming,面向切面编程)是Spring框架中的一个重要功能,旨在帮助开发人员分离关注点,使代码更加模块化。AOP通过将关注点(如事务管......
  • Spring学习(四)AOP分析
    动态代理:代理模式的解释:为其他对象提供一种代理以控制对这个对象的访问,增强一个类中的某个方法,对程序进行扩展。切面(aspectj),切面包含切点(pointCut)和增强方法(advice),对连接点(joinPoint,类的方法就是连接点),然后织入(Weaving),原始对象为代理对象(target)AOP实现地方1、@Lazy,2.事务,3.日志......