springbootAOP定义切点获取/修改请求参数方式

 更新时间:2024年08月27日 08:38:06   作者:Yonu  
这篇文章主要介绍了springbootAOP定义切点获取/修改请求参数方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

AOP介绍

1.六种通知方式

  • 环绕通知:在目标方法执行前和执行后实施增强,可用于日志记录,事务处理等
  • 前置通知:在目标方法执行前实施增强,可用于权限管控等
  • 后置返回通知:在目标方法成功执行后实施增强,可用于关闭流,删除临时文件等
  • 后置通知:在目标方法执行后实施增强(无论方法是否发生异常都执行),可用于释放资源
  • 异常通知:在目标方法抛出异常时实施增强,可用于处理异常,记录日志等
  • 引入通知:在目标类中添加一些方法和属性,用于修改目标类

2.AspectJ相关注解

  • @Aspect:用于定义一个切面,注解在切面类上
  • @Pointcut:用于定义切点表达式,在使用时,需要定义一个切入点方法,该方法返回值为void,且方法体为空的普通方法
  • @Before:用于定义前置通知,通常为其指定value属性,该值可以是已有切入点,也可以定义切点表达式
  • @AfterReturning:用于定义后置返回通知,通常为其指定value属性,该值可以是已有切入点,也可以定义切点表达式
  • @Around:用于定义环绕通知,通常为其指定value属性,该值可以是已有切入点,也可以定义切点表达式
  • AfterThrowing:用于定义异常通知,通常为其指定value属性,该值可以是已有切入点,也可以定义切点表达式。另外还有一个 throwing属性用于访问目标方法抛出的异常,该属性值与异常通知方法中同名的形参一致
  • After:用于定义后置最终通知,通常为其指定value属性,该值可以是已有切入点,也可以定义切点表达式

定义切入点的两种方式

1.注解

//定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SafetyHarness {
    String defaultValue() default "";
}
//切入点
@Pointcut("@annotation(com.xx.xx.xx.web.annotation.SafetyHarness)")
    public void efficacyParameters(){
    }

2.表达式

//该controller所有方法,可以直接指定
/*
execution():表达式主体
第一个 * 表示返回类型,使用*表示所有类型,该 * 与包名之间有一个空格
第二个 * 表示类名
第三个 * 表示方法名
..表示任意参数
*/
@Pointcut("value = "execution(* com.xx.xx.xx.web.controller.*.* (..)))")
    public void efficacyParameters(){
    }

常用两种通知获取参数

1.@Before

@Before("efficacyParameters()")
    public void beforeEfficacyParameters(JoinPoint joinPoint){
            //获取请求参数
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = Objects.requireNonNull(attributes).getRequest();
            Map<String, String[]> parameterMap = request.getParameterMap();
        	//通过参数名获取
            Object ext1 = parameterMap.get("ext1");
            Object ext2 = parameterMap.get("ext2");
    }

2.@Around

	@Around("efficacyParameters()")
    public T beforeEfficacyParameters(ProceedingJoinPoint joinPoint){
        	//接口返回结果,该结果可在业务前或业务后执行
            Object proceed = joinPoint.proceed();
   			
            Object[] obj = joinPoint.getArgs();
            if (obj == null || obj.length == 0) {
                return T;
            }
           //获取请求参数 
            Map<String, Object> fieldsName = getFieldsName(joinPoint);
            Object ext1 = fieldsName.get("ext1");
            //POST请求强转
            SafetyAuditPageVo ext2 = (SafetyAuditPageVo) fieldsName.get("ext");

			//修改请求参数
			SafetyAuditPageVo vo = (SafetyAuditPageVo) obj[0];
                vo.setXxxx("XXXXXX");
                obj[0] = vo;
                return  joinPoint.proceed(obj);
    }

	private static Map<String, Object> getFieldsName(ProceedingJoinPoint joinPoint) {
      
        Object[] args = joinPoint.getArgs();
        ParameterNameDiscoverer pnd = new DefaultParameterNameDiscoverer();
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        String[] parameterNames = pnd.getParameterNames(method);
        Map<String, Object> paramMap = new HashMap<>(32);
        for (int i = 0; i < parameterNames.length; i++) {
            paramMap.put(parameterNames[i], args[i]);
        }
        return paramMap;
    }

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot整合MongoDB的实现代码

    SpringBoot整合MongoDB的实现代码

    自己本科时候一直使用的是Mysql,目前的课题组使用的是MongoDB,因此就花了一部分时间整理了一下,实现springboot与MongoDB的整合,并且实现基本的增删改查操作,从头到尾给出一个完整的案例。
    2021-05-05
  • Spring Boot实现发送邮件

    Spring Boot实现发送邮件

    这篇文章主要为大家详细介绍了Spring Boot实现发送邮件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • springboot项目关闭swagger如何防止漏洞扫描

    springboot项目关闭swagger如何防止漏洞扫描

    这篇文章主要介绍了springboot项目关闭swagger如何防止漏洞扫描,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • Eureka源码阅读解析Server服务端启动流程实例

    Eureka源码阅读解析Server服务端启动流程实例

    这篇文章主要为大家介绍了Eureka源码阅读解析Server服务端启动流程实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • SpringBoot之RestTemplate在URL中转义字符的问题

    SpringBoot之RestTemplate在URL中转义字符的问题

    这篇文章主要介绍了SpringBoot之RestTemplate在URL中转义字符的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Java实现数据库连接池的方法

    Java实现数据库连接池的方法

    这篇文章主要介绍了Java实现数据库连接池的方法,涉及java数据库连接池的创建、连接、刷新、关闭及状态获取的常用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • Spring 面向切面编程AOP实现详解

    Spring 面向切面编程AOP实现详解

    这篇文章主要介绍了Spring 面向切面编程AOP实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • 搞懂JAVAObject中的hashCode()

    搞懂JAVAObject中的hashCode()

    今天小编就为大家分享一篇关于关于Object中equals方法和hashCode方法判断的分析,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2021-08-08
  • SpringBoot项目热部署的实现

    SpringBoot项目热部署的实现

    SpringBoot项目热部署是一种让开发人员在修改代码后无需重启应用即可看到更改效果的技术,通过使用SpringBoot的DevTools等工具,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-09-09
  • mybatis-plus批量更新太慢该如何解决详解

    mybatis-plus批量更新太慢该如何解决详解

    这篇文章主要给大家介绍了关于mybatis-plus批量更新太慢该如何解决的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-03-03

最新评论