欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

访问controller接口前修改方法入参,参数为对象(如@@RequestBody HttpHeaders headers)

程序员文章站 2022-04-25 22:06:01
...

可以通过环绕通知实现
这里我是扫描自定义注解。

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * @Author: NJ
 * @Description: 切面,替换自定义注解下面的header
 * @Date: 2019/8/8
 */
@Component
@Aspect
public class AnnotationAspect {

    @Pointcut("@annotation(com.annotation.ChangeHeader)")
    private void cutMethod() {

    }


    /**
     * 环绕通知,修改header  @ChangeHeader标记的方法修改header
     * 目前使用该注解之在用户相关controller添加
     * @param pjp
     * @return
     * @throws Throwable
     */
    @Around("cutMethod()")
    public Object changeHeader(ProceedingJoinPoint pjp) throws Throwable{
        //获取传入的参数
        Object[] args = pjp.getArgs();
        ReturnMsg<String> returnMsg = new ReturnMsg<>();

        try {
            for(int i = 0; i < args.length; i++){
                if(args[i] instanceof  HttpHeaders){
                    HttpHeaders paramValue = (HttpHeaders)args[i];
					/** 修改参数 **/
                    paramValue.set("loginUserName",“替换原来header里的值”);
                    /** 修改入参 **/
                    args[i] = paramValue;
                    
                }
            }
        }catch (Exception e){
            /** 异常,抛出json格式内容  **/
            e.printStackTrace();
            returnMsg.handleException(e);
            return returnMsg;
        }

        /** 放行,进入方法 **/
        Object retVal = pjp.proceed(args)
        return retVal;
    }
}

相关标签: springAop