java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > springbootAOP定义切点获取修改请求参数

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

作者:Yonu

这篇文章主要介绍了springbootAOP定义切点获取/修改请求参数方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

AOP介绍

1.六种通知方式

2.AspectJ相关注解

定义切入点的两种方式

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;
    }

总结

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

您可能感兴趣的文章:
阅读全文