查询参数中如果有传入%的情况,数据会被全量返回。类似的可能还会有一些特殊符号的情况存在。这个时候可能需要在查询数据的时候进行参数转义处理。一般情况可能会考虑选择下面的两种方式处理。
一、基于Filter处理
主要通过实现Filter接口,自定义HttpServletRequestWrapper处理参数数据。
- 注意事项
- 全局参数的一个统一拦截替换。不是能很好的区分增删改查,进行更细粒度的控制。
二、基于Interceptor处理
主要通过实现Interceptor接口,自定义处理查询操作的参数数据。
- 注意事项
- 可以支持仅处理查询操作的参数。
- 参数的类型会比较多,需要根据不同的参数类型进行单独的处理。
@Slf4j
@AllArgsConstructor
@Intercepts({@Signature(type = ParameterHandler.class, method = "setParameters", args = PreparedStatement.class)})
public class ParameterEscapeInterceptor implements Interceptor {private static final Pattern EW_SQL_PATTERN = Pattern.compile("\\w+\\s\\S+\\s#\\{ew.paramNameValuePairs.MPGENVAL\\d+}");private static final Pattern EW_MPG_PATTERN = Pattern.compile("MPGENVAL\\d+");private final ParameterEscapeProperties parameterEscapeProperties;@Overridepublic Object intercept(Invocation invocation) throws Throwable {ParameterHandler parameterHandler = (ParameterHandler) invocation.getTarget();MetaObject metaObject = MetaObject.forObject(parameterHandler, SystemMetaObject.DEFAULT_OBJECT_FACTORY,SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY, new DefaultReflectorFactory());if (!"SELECT".equalsIgnoreCase(String.valueOf(metaObject.getValue("sqlCommandType")))) {return invocation.proceed();}Object parameterObject = parameterHandler.getParameterObject();if (null == parameterObject) {return invocation.proceed();}if (parameterObject instanceof Map) {Map<String