@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ValidateToken {
}
@Slf4j
//指定切面的优先级,当有多个切面时,数值越小优先级越高
@Order(1)
@Aspect
@Configuration
public class ValidateTokenAspect {
@Value("${admin.token}")
private String adminToken;
@Pointcut("execution(public * com.umgsai.platform.order.sync.core.service.impl..*.*(..))")
public void declareJoinPointExpression() {
}
@Before("declareJoinPointExpression()")
public void beforeMethod(JoinPoint joinpoint) {
// 从RPC上下文中取出token参数
String token = TraceContext.getContext().get("token");
log.info("RpcContext token={} adminToken={}", token, adminToken);
Signature signature = joinpoint.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
Method method = methodSignature.getMethod();
// 需要进行token校验的方法上配置ValidateToken注解
ValidateToken methodComment = method.getAnnotation(ValidateToken.class);
if (methodComment == null) {
return;
}
String className = joinpoint.getTarget().getClass().getName();
String methodName = joinpoint.getSignature().getName();
List<Object> args = Arrays.asList(joinpoint.getArgs());
String[] parameterNames = methodSignature.getParameterNames();
if (StringUtils.equals(adminToken, token)) {
log.info("className={}, methodName={}, args={}, parameterNames={} token validate success", className, methodName, args, parameterNames);
return;
}
log.error("className={}, methodName={}, args={}, parameterNames={} token validate failed, please check token", className, methodName, args, parameterNames);
throw new YppRunTimeException(Code.ERROR_PARAM);
}
}
调用方需要通过如下方式将token放在RPC context中
TraceContext.getContext().put("token", "a6a9fc593f85");