查詢參數中如果有傳入%的情況,數據會被全量返回。類似的可能還會有一些特殊符號的情況存在。這個時候可能需要在查詢數據的時候進行參數轉義處理。一般情況可能會考慮選擇下面的兩種方式處理。
一、基于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