首页 > 其他分享 >Spring拦截顺序

Spring拦截顺序

时间:2024-02-16 15:22:40浏览次数:22  
标签:顺序 Spring 接口 参数 切面 aspect 注解 拦截 方法

请求进入:filter -> interceptor ->controllerAdvice -> aspect -> controller

响应返回:controller -> aspect  -> controllerAdvice -> interceptor -> filter 

 场景:

1、全局日志切面:

通过aspect切面实现(类上有Aspect注解,Order注解value为1来规定在aspect切面中当前类被优先注册),增强类型为around环绕型(也就是切面的方法上注解为@Around),切入点为实现Controller注解和RestController注解的类里面的方法(Around注解的value为@within RestController || @within Controller),方法内部的逻辑就是通过切面的参数point(around切面的参数为ProceedingJoinPoint)获取你要切入的那个controller方法的入参(point.getArgs()),然后将这个入参塞入request的attribute中 ,request是通过RequestContextHolder(request 容器)获取的,然后执行point的proceed方法去执行相应的业务逻辑,获取返回的参数,将这个返回参数和之前的获取的输入参数经过一系列处理,最后Json序列化之后打印出来。

2、 ControllerAdvice 的应用:

之前写了一个接口,接口正常上线,后面相关功能做改造,要求这个接口在原来的基础上再多返回一个字段,这个字段跟具体的业务没有关系,相当于在原来的接口上做了一个扩展,那么这个功能后端是怎么改造的呢,是写了一个拦截类,这个类标注了RestControllerAdvice注解,并且实现了ResponseBodyAdvice接口(通过这样就把这个类写成了一个controllerAdvice),在这个类中会重写两个方法,一个是supports方法,这个方法代表包装的开启与否,return为true就是开启,还有个方法是beforeBodyWrite,在这个方法里实现就是相应接口的扩展功能,但是这里有一个问题,就是通过这样实现的controllerAdvice,会拦截所有的controller,所以在包装方法里第一件事就是过滤,通过request的getServletPath来过滤,对符合要求的请求返回体进行修改,这个请求的方法体是写在beforeBodyWrite的参数里的,修改完之后return。

问题:

上面的通过实现一个ControllerAdvice 来扩展接口的功能,功能本身是没问题的,前端能收到正确的相应数据,但是有一个问题就是全局日志是通过aspect实现的,aspect的执行顺序在ControllerAdvice 之前,也就是说,全局日志所打印的这个接口的日志文件,是错误的,少一个参数,少了那个在ControllerAdvice 里面被包装进去的那个参数。

标签:顺序,Spring,接口,参数,切面,aspect,注解,拦截,方法
From: https://www.cnblogs.com/zeevy/p/18017186

相关文章

  • Spring循环依赖
    1、Spring初始化bean的过程(bean的生命周期)1. Spring扫描class文件得到beanDefinition2. BeanDefinition首先根据class的构造方法反射得到一个对象(如果反射无法获取对象,则根据工厂方法生成)3. 实现属性的依赖注入4. 如果实现了BeanNameAware接口,调用setBeanName方法,为beanName......
  • springboot的web项目部署_前后端整合部署
    springboot的web项目部署[2]_前后端整合部署vite.config.ts  build:{   //build编译后存放静态文件的目录   outDir:"../renren-admin/src/main/resources/static",  ShiroConfig.javafilterMap.put("/**/*.html","anon");filterMap.put(&......
  • Spring常见三种注入方式
    1、field注入(字段注入)1@Controller2publicclassFooController{3  @Autowired4  privateFooServicefooService;5  6  //简单的使用例子,下同7  publicList<Foo>listFoo(){8    returnfooService.list();9 }10}最......
  • SpringBoot整合OSS中的设计模式----单例模式
    在SpringBoot项目中使用OSS存储上传的图片,需要配置OSS设置信息。避免对象的重复创建,确保一个类只有一个实例,并提供一个全局访问点来访问该实例,于是用到了单例模式,这里复习一下单例模式。单线程----懒汉式@Data@Component@ConfigurationProperties(prefix="aliyun.oss")pu......
  • 代码块使用实例(主要关注各部分的执行顺序)
    1分析1当创建一个子类对象时,首先加载父类和子类到方法区。然后对子类和父类执行静态代码块和静态属性的初始化;2接着从子类的构造器入手,构造器前两行隐藏了①super();②普通代码块和普通属性初始化两个操作;所以先执行super(),这里的执行同上;再执行普通代码块和普通属性初始化;......
  • jvm shutdownHook + spring 自定义事件实现业务处理
    jvm的shutdownHook可以实现对于jvm退出的一些处理,比如资源清理,异常事件通知,spring自定义事件(或者使用内部的)可以实现bean的一些事件驱动处理,两个结合起来可以方便我们进行一些业务处理一些业务场景资源清理服务停止业务状态一致性补偿服务注册场景中的取消注册服务停......
  • Java与SpringBoot网站的重构
    Java简介Java特点: Java的运行原理: SpringBoot网站的重构有源码的情况后台重构(mysql+maven+jdk+网站源码)将网站源码放入idea软件中查看重要配置文件:pom.xml和application.propertiespom.xml有网站的jdk版本和打包软件而application.properites文件中有着数据库的配......
  • springboot自定义starter 版本大于2.7
    相关jar包<!--提示配置--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><version>3.2.1</versi......
  • SQL语句执行顺序相关问题
    注意本文是SQL执行顺序,不是MySQLServer内部执行流程。MySQL并非像PostgreSQL(被认为是最接近SQL标准的数据库之一)一样严格按照SQL标准,MySQL执行引擎会根据查询的具体情况和优化策略来决定具体的执行顺序,所以SQL执行顺序是理论顺序。书写顺序select...from...join...on...wher......
  • 大年初二学习SpringBoot之权限管理
    1增加spring-security依赖目前市面上主流的权限框架是:spring-security和shiro,shrio使用起来更简单,而spring-security的功能更强大。苏三商城项目选择的权限框架是:spring-security。首先要加入spring-security的相关依赖包。在项目中的pom.xml文件中增加如下依赖:<dependency......