SpringBoot(11)AOP切入方法在不改变Controller任何代码的情况下获取额外参数

这篇具有很好参考价值的文章主要介绍了SpringBoot(11)AOP切入方法在不改变Controller任何代码的情况下获取额外参数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

有一个Controller的方法addw(int name){},返回值为void,映射路径是/addw,前端传入的参数有name、id、age,现在希望在不改变Controller的方法的前提下,使用AOP切入一个新的方法addall(),此时,addall方法可以获取的参数为name,有没有什么办法,在不改变Controller任何代码的情况下获取到id、age

在不改变Controller代码的情况下,addall方法无法直接获取前端传入的id、age参数。因为这些参数是通过HTTP请求的query参数或body参数传递的,而AOP只能拦截Controller方法的调用,无法直接拦截HTTP请求的处理过程。

但是可以通过一些技巧来实现在不改变Controller任何代码的情况下获取到id、age参数,例如:

  • 使用ThreadLocal保存参数:在Controller方法中将参数保存到ThreadLocal中,然后在AOP拦截的方法中获取ThreadLocal中的参数。这种方法需要在Controller方法中加入一些额外的代码。

  • 使用HttpServletRequest获取参数:在AOP拦截的方法中,通过HttpServletRequest对象获取请求中的参数。这种方法不需要在Controller方法中加入额外的代码,但需要在AOP拦截的方法中添加HttpServletRequest对象参数,并且需要注意参数名与请求参数名的一致性。

使用HttpServletRequest获取参数的解决方案进行举例

下面是使用HttpServletRequest获取参数的示例代码:

Controller方法:

@RequestMapping(value = "/addw", method = RequestMethod.POST)
public void addw(@RequestParam("name") String name) {
    // Controller方法中只获取了name参数
    System.out.println("Controller方法中获取的参数 name:" + name);
}

AOP拦截方法:

@Around("execution(* com.example.controller.TestController.addw(..))")
public void addall(ProceedingJoinPoint joinPoint) throws Throwable {
    // 获取HttpServletRequest对象
    HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    // 通过HttpServletRequest对象获取参数
    String id = request.getParameter("id");
    String age = request.getParameter("age");
    System.out.println("AOP拦截方法中获取的参数 id:" + id);
    System.out.println("AOP拦截方法中获取的参数 age:" + age);
    // 调用Controller方法
    joinPoint.proceed();
}

在上述代码中,AOP拦截方法中通过RequestContextHolder获取当前请求的HttpServletRequest对象,然后通过调用HttpServletRequest的getParameter方法获取请求中的参数。注意需要在AOP拦截方法中添加HttpServletRequest对象参数,并且需要与请求参数名一致。同时需要注意,如果请求参数名与参数类型不一致,则会出现参数值为null的情况。

RequestContextHolder.getRequestAttributes()没有获取到数据

如果RequestContextHolder.getRequestAttributes()没有获取到数据,可能是因为在AOP拦截方法执行的过程中,当前线程的请求对象已经被清除,导致无法获取请求信息。这种情况通常出现在异步线程池等情况下。

为了解决这个问题,可以尝试使用RequestContextHolder.getRequestAttributes()获取请求上下文对象,并在拦截方法中进行非空判断。

下面是修改后的示例代码:

@Around("execution(* com.example.controller.TestController.addw(..))")
public void addall(ProceedingJoinPoint joinPoint) throws Throwable {
    // 获取HttpServletRequest对象
    ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    if (requestAttributes == null) {
        // 请求上下文对象为空,处理异常或者直接返回
        return;
    }
    HttpServletRequest request = requestAttributes.getRequest();
    // 通过HttpServletRequest对象获取参数
    String id = request.getParameter("id");
    String age = request.getParameter("age");
    System.out.println("AOP拦截方法中获取的参数 id:" + id);
    System.out.println("AOP拦截方法中获取的参数 age:" + age);
    // 调用Controller方法
    joinPoint.proceed();
}

在上述代码中,我们使用RequestContextHolder.getRequestAttributes()获取请求上下文对象,并进行非空判断。如果获取到的请求上下文对象为空,我们可以根据实际情况进行异常处理或直接返回。文章来源地址https://www.toymoban.com/news/detail-428052.html

到了这里,关于SpringBoot(11)AOP切入方法在不改变Controller任何代码的情况下获取额外参数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Spring教程16】Spring框架实战:详解解读AOP配置管理中AOP切入点表达式和通知类型

    欢迎大家回到《 Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《 如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》,本文的上一篇为《 AOP的工作流程和AOP的核心概念》 前面的案例中,有涉及到如下内容: 对于

    2024年02月04日
    浏览(40)
  • Spring02-Spring注解的使用、基于注解的IOC、纯注解配置、整合Junit、AOP入门、基于配置文件的AOP、切入点表达式、基于配置的文件环绕通知

    学习基于注解的 IOC 配置,即注解配置 和 XML 配置要实现的功能都是一样的,都是要降低程序间的耦合。只是配置的形式不一样。 关于实际的开发中到底使用xml还是注解,每家公司有着不同的使用习惯 , 所以这两种配置方式我们都需要掌握。 把 Spring 的 xml 配置内容改为使用

    2024年02月03日
    浏览(74)
  • springboot对controller方法进行单元测试

    单元测试有助于验证程序的执行逻辑是否正确。controller层的单元测试,已经和接口测试很类似了。执行单元测试以前,需要添加测试依赖。 1. 生成一个单元测试基础类 注意需要添加的注解。 2. 没有参数的单元测试 执行单元测试,可以看到如下输出: 3. 有参数的单元测试(

    2024年02月11日
    浏览(77)
  • SpringBoot 增强Controller方法,@ControllerAdvice注解的使用

    参考资料 @ControllerAdvice 用法 SpringBoot使用@ControllerAdvice注解 @ControllerAdvice ,是Spring3.2提供的新注解,它是一个Controller增强器,可对controller进行增强处理。 配合 @ExceptionHandler 注解,进行全局异常处理。 配合 @InitBinder 注解,用来设置 WebDataBinder ,用于自动绑定前台请求参数到

    2024年02月08日
    浏览(42)
  • springboot的MockMvc单元测试(测试controller层方法)

    所谓单元测试,即用一小段可以独立运行的代码,去测试一个比较底层的单独的功能。 如果需要对controller层的方法进行测试,那么我们可以使用springboot提供的MockMvc,模拟客户端的请求来测试。    只有我们去执行测试类时,该依赖才会被加载   该注解为类级别批注,该注

    2024年02月15日
    浏览(40)
  • Java | 使用切面AOP拦截并修改Controller接口请求参数

    关注common wx: CodingTechWork   在开发过程中,会有一些需求将controller层的一些方法入参进行全量转换,最容易想到的可能是在调用下层service方法时,调用公共的方法进行入参转换,这时带来的唯一问题就是代码不雅观,比较冗余。那还有什么方法可以更优雅的解决这个问题

    2024年01月24日
    浏览(45)
  • springboot~aop方法拦截Aspect和InvocationHandler的理解

    在 Spring 中, @Autowired 注解的使用在不同的上下文中会产生不同的效果,这取决于所在的组件或类是否由 Spring 管理。 @Aspect 注解的使用 : @Aspect 注解通常用于声明切面,而切面是 Spring 管理的组件。因此, @Autowired 注解可以直接用于切面类,以注入其他 Spring 托管的 bean。S

    2024年02月10日
    浏览(32)
  • 如何在不支持TPM.2 的电脑安装win11

          使用ULTRAISO工具,将光盘目录\\\"sourcesappraiserres.dll\\\"删除并创建目录名为\\\"appraiserres.dll\\\"的目录.  选择不下载更新,下载更新可能会下载新的appraiserres.dll文件将上述的修改无效化.   使用U盘启动盘(优启通等软件制作...),直接加载iso文件安装,使用这种方式好像不好会检测安装条

    2024年02月04日
    浏览(45)
  • Java AOP 通过注解实现切面及通过注解改变返回值

    学习过java的小伙伴都知道Spring的重要知识点之一就是AOP,AOP也就是切面编程,切面编程它能够帮助我们实现非侵入式的功能增强,解耦现有的业务逻辑和要新增的功能增强。 实际应用中的场景 事务管理、拦截器、日志处理、权限控制等。 AOP的增强方式 前置增强、后置增强

    2024年02月14日
    浏览(40)
  • springboot使用aop排除某些方法,更新从另外一张表,从另外一张表批量插入

    在Spring Boot中使用AOP时,如果想要排除某些方法不被切面所影响,可以通过使用切面表达式中的!within来实现。以下是一个示例: 在上面的示例中,@Before注解用于定义切面的beforeAdvice方法。execution(* com.example.service. . (…))表示切入所有com.example.service包下的方法。而!wit

    2024年02月13日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包