%
_
是MySql
中的特殊字符,如需对这几个字符在Mysql中进行模糊搜索则需要进行转义处理 \_
\%
SpringBoot
接收查询参数,然后拦截做特殊处理
注解
@Target({METHOD, FIELD, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
public @interface LikeCondition {
}
切面
@Aspect
@Component
@Slf4j
public class LikeConditionAspect {
@Pointcut(value = "@annotation(cn.worken.mobile.config.common.annotation.LikeCondition)")
public void pointcut() {
}
@Around(value = "pointcut() ")
public Object inject(ProceedingJoinPoint pjp) throws Throwable {
Object[] args = pjp.getArgs();
if(args.length>0){
/**
* 处理 @RequestBody 和 对象传参等
*/
for (int i = 0; i < args.length; i++) {
Class<?> aClass = args[i].getClass();
Field[] declaredFields = aClass.getDeclaredFields();
for (Field declaredField : declaredFields) {
LikeCondition annotation = declaredField.getAnnotation(LikeCondition.class);
if(annotation != null){
declaredField.setAccessible(true);
Object field = ReflectionUtils.getField(declaredField,args[i]);
ReflectionUtils.setField(declaredField,args[i],replaceLikeCondition(field));
}
}
}
/**
* 处理 @RequestParam @PathVariable 相关的参数
*/
MethodSignature signature = (MethodSignature) pjp.getSignature();
Parameter[] parameters = signature.getMethod().getParameters();
for (int i = 0; i < parameters.length; i++) {
Parameter parameter=parameters[i];
LikeCondition annotation = parameter.getAnnotation(LikeCondition.class);
if(annotation != null){
args[i] = replaceLikeCondition(args[i]);
}
}
}
// result的值就是被拦截方法的返回值
Object result = pjp.proceed(args);
return result;
}
static Object replaceLikeCondition(Object arg){
if(arg instanceof String){
String argStr = arg.toString();
return argStr.replaceAll("%","\\\\\\%")
.replaceAll("_","\\\\\\_");
}
return arg;
}
}
使用
在请求方法前和 Req
中的具体参数上 加上 注解 @LikeCondition