aop校验接口中传入的对象的字段中是否含有特殊字符
时间: 2024-09-23 07:16:57 浏览: 51
注解+AOP优雅的实现java项目的接口参数校验(含源码)
在Spring AOP(面向切面编程)中,如果你想要校验接口传递给方法的参数对象(如实体类)的字段中是否含有特殊字符,你需要将关注点从单个参数转移到整个对象上。这可以通过创建一个代理类(proxy)来实现,该代理类会对每个字段进行检查。这里有一个简化版的例子:
```java
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
@Aspect
public class FieldValidationAspect {
@Around("execution(* your.package..*(your.InterfaceType *param))") // 替换为实际接口和类型
public Object validateFieldsBeforeCall(ProceedingJoinPoint joinPoint) throws Throwable {
Object param = joinPoint.getArgs()[0];
if (param != null) { // 如果参数非null
Class<?> clazz = param.getClass();
BeanInfo beanInfo = Introspector.getBeanInfo(clazz);
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor descriptor : propertyDescriptors) {
String propertyName = descriptor.getName();
Object fieldValue = Introspector.getBeanPropertyAccessor(param).getPropertyValue(param, propertyName);
if (fieldValue instanceof String && !isSafe(fieldValue.toString())) {
throw new IllegalArgumentException("参数对象的字段 " + propertyName + " 包含了特殊字符");
}
}
}
// 继续执行原方法
return joinPoint.proceed();
}
private boolean isSafe(String value) {
// 自定义特殊的字符列表或正则表达式
String[] specialChars = {"'", "\"", "<", ">", "|", "{"};
for (String charToCheck : specialChars) {
if (value.contains(charToCheck)) {
return false;
}
}
return true;
}
}
```
这个切面会在调用指定接口方法前遍历参数对象的所有字段,检查其中的字符串字段是否包含特殊字符。如果发现有,就抛出异常。
阅读全文