405b22c3976d86f503f972a7b9809246298c1632.svn-base 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package cn.com.goldenwater.dcproj.target;
  2. import org.aspectj.lang.JoinPoint;
  3. import org.aspectj.lang.annotation.Aspect;
  4. import org.aspectj.lang.annotation.Before;
  5. import org.aspectj.lang.annotation.Pointcut;
  6. import org.aspectj.lang.reflect.MethodSignature;
  7. import org.springframework.stereotype.Component;
  8. import java.lang.reflect.Field;
  9. import java.lang.reflect.Parameter;
  10. import java.util.Arrays;
  11. @Aspect
  12. @Component("validInValueAop")
  13. public class ValidInValueAop {
  14. private final static String[] badSqlflag=new String[]{"(",")","=","<",">"};
  15. @Pointcut("@annotation(cn.com.goldenwater.dcproj.target.ValidInValue)")
  16. public void validInValueAop() {
  17. }
  18. @Before(value = "validInValueAop()")
  19. public void beforeMethod(JoinPoint joinPoint) throws Exception {
  20. Object[] args = joinPoint.getArgs();
  21. //获取方法参数
  22. MethodSignature signature = (MethodSignature) joinPoint.getSignature();
  23. Parameter[] parameters = signature.getMethod().getParameters();
  24. for (int i = 0; i < parameters.length; i++) {
  25. Parameter parameter = parameters[i];
  26. Class<?> paramClazz = parameter.getType();
  27. Object arg = Arrays.stream(args).filter(ar -> paramClazz.isAssignableFrom(ar.getClass())).findFirst().get();
  28. //得到参数的所有成员变量
  29. Field[] declaredFields = paramClazz.getDeclaredFields();
  30. for (Field field : declaredFields) {
  31. field.setAccessible(true);
  32. ValidInValue validInValue = field.getAnnotation(ValidInValue.class);
  33. if (validInValue != null) {
  34. if (!String.class.isAssignableFrom(field.getType())) {
  35. throw new RuntimeException("ValidInValue Annotation using in a wrong field class");
  36. }
  37. String fieldStr = (String) field.get(arg);
  38. //该字段可以为空,但是不能包含特殊字符
  39. if(fieldStr !=null && !"".equals(fieldStr.trim())){
  40. for(String str:badSqlflag){
  41. if(fieldStr.contains(str)){
  42. throw new RuntimeException(field.getName()+validInValue.msg());
  43. }
  44. }
  45. }
  46. }
  47. }
  48. }
  49. }
  50. }