@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");