131 lines
4.3 KiB
Java
131 lines
4.3 KiB
Java
package com.cm.common.aspect;
|
|
|
|
import com.cm.common.annotation.CheckRequestBodyAnnotation;
|
|
import com.cm.common.exception.ParamsException;
|
|
import com.cm.common.utils.annotation.AnnotationUtil;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.aspectj.lang.JoinPoint;
|
|
import org.aspectj.lang.Signature;
|
|
import org.aspectj.lang.annotation.Aspect;
|
|
import org.aspectj.lang.annotation.Before;
|
|
import org.aspectj.lang.annotation.Pointcut;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.springframework.core.annotation.Order;
|
|
import org.springframework.stereotype.Component;
|
|
import org.springframework.web.bind.annotation.RequestBody;
|
|
|
|
import java.lang.reflect.Method;
|
|
import java.lang.reflect.Parameter;
|
|
|
|
/**
|
|
* When you feel like quitting. Think about why you started
|
|
* 当你想要放弃的时候,想想当初你为何开始
|
|
*
|
|
* @ClassName: ApiParamsAspect
|
|
* @Description: api接口
|
|
* @Author: WangGeng
|
|
* @Date: 2019/11/14 15:36
|
|
* @Version: 1.0
|
|
**/
|
|
@Aspect
|
|
@Component
|
|
@Order(1)
|
|
public class ApiParamsAspect {
|
|
private static final Logger LOG = LoggerFactory.getLogger(ApiParamsAspect.class);
|
|
|
|
@Pointcut("execution(public * com.cm.*.controller..*.*(..))")
|
|
public void apiCutPoint() {
|
|
}
|
|
|
|
@Pointcut("execution(public * com.cm.common.plugin.controller..*.*(..))")
|
|
public void pluginCutPoint() {
|
|
}
|
|
|
|
@Pointcut("execution(public * com.cm.common.plugin.oauth.controller..*.*(..))")
|
|
public void oauthCutPoint() {
|
|
}
|
|
|
|
@Pointcut("execution(public * com.cm.common.article.controller..*.*(..))")
|
|
public void articleCutPoint() {
|
|
}
|
|
|
|
@Pointcut("execution(public * com.cm.common.wechat.controller..*.*(..))")
|
|
public void wechatCutPoint() {
|
|
}
|
|
|
|
@Before("apiCutPoint()")
|
|
public void beforeApiCutPoint(JoinPoint joinPoint) throws ParamsException {
|
|
beforeCutPoint(joinPoint);
|
|
}
|
|
|
|
@Before("pluginCutPoint()")
|
|
public void beforePluginCutPoint(JoinPoint joinPoint) throws ParamsException {
|
|
beforeCutPoint(joinPoint);
|
|
}
|
|
|
|
@Before("oauthCutPoint()")
|
|
public void beforeOauthCutPoint(JoinPoint joinPoint) throws ParamsException {
|
|
beforeCutPoint(joinPoint);
|
|
}
|
|
|
|
@Before("articleCutPoint()")
|
|
public void beforeArticleCutPoint(JoinPoint joinPoint) throws ParamsException {
|
|
beforeCutPoint(joinPoint);
|
|
}
|
|
|
|
@Before("wechatCutPoint()")
|
|
public void beforeWechatCutPoint(JoinPoint joinPoint) throws ParamsException {
|
|
beforeCutPoint(joinPoint);
|
|
}
|
|
|
|
private void beforeCutPoint(JoinPoint joinPoint) throws ParamsException {
|
|
Signature signature = joinPoint.getSignature();
|
|
Object[] args = joinPoint.getArgs();
|
|
Class<?> targetClazz = joinPoint.getTarget().getClass();
|
|
Method method = getMethod(signature.getName(), targetClazz.getMethods(), args);
|
|
if (method == null) {
|
|
return;
|
|
}
|
|
|
|
if (method.isAnnotationPresent(CheckRequestBodyAnnotation.class)) {
|
|
LOG.debug("校验参数");
|
|
Parameter[] parameters = method.getParameters();
|
|
for (Parameter parameter : parameters) {
|
|
if (parameter.isAnnotationPresent(RequestBody.class)) {
|
|
for (Object arg : args) {
|
|
if (parameter.getType() == arg.getClass()) {
|
|
AnnotationUtil.checkField(arg);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private Method getMethod(String methodName, Method[] methods, Object[] args) {
|
|
for (Method method : methods) {
|
|
Class<?>[] parameterTypes = method.getParameterTypes();
|
|
// 方法名称相同
|
|
if (StringUtils.equals(methodName, method.getName())) {
|
|
// 参数长度相同
|
|
if (args.length == parameterTypes.length) {
|
|
// 参数类型顺序相同
|
|
boolean isThisMethod = true;
|
|
for (int argIndex = 0; argIndex < args.length; argIndex++) {
|
|
if (!parameterTypes[argIndex].isInstance(args[argIndex])) {
|
|
isThisMethod = false;
|
|
break;
|
|
}
|
|
}
|
|
if (isThisMethod) {
|
|
return method;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
}
|