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

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

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/28
 */
@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 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;
    }
}

 @Pointcut("execution(public * com..project.web..*(..))")
 扫描一个包下所有controller,包括子包下

你可能感兴趣的:(springAop)