package org.springblade.core.mp.resolver;
|
|
import com.baomidou.mybatisplus.core.metadata.OrderItem;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import org.springblade.core.tool.utils.ObjectUtil;
|
import org.springblade.core.tool.utils.StringPool;
|
import org.springblade.core.tool.utils.StringUtil;
|
import org.springframework.core.MethodParameter;
|
import org.springframework.lang.NonNull;
|
import org.springframework.web.bind.support.WebDataBinderFactory;
|
import org.springframework.web.context.request.NativeWebRequest;
|
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
|
import org.springframework.web.method.support.ModelAndViewContainer;
|
|
/**
|
* 解决 Mybatis Plus page SQL注入问题
|
*
|
* @author L.cm
|
*/
|
public class PageArgumentResolver implements HandlerMethodArgumentResolver {
|
private static final String ORDER_ASC = "asc";
|
|
@Override
|
public boolean supportsParameter(MethodParameter parameter) {
|
return Page.class.equals(parameter.getParameterType());
|
}
|
|
/**
|
* page 参数解析
|
*
|
* @param parameter MethodParameter
|
* @param mavContainer ModelAndViewContainer
|
* @param request NativeWebRequest
|
* @param binderFactory WebDataBinderFactory
|
* @return 检查后新的page对象
|
*/
|
@Override
|
public Object resolveArgument(@NonNull MethodParameter parameter, ModelAndViewContainer mavContainer,
|
NativeWebRequest request, WebDataBinderFactory binderFactory) {
|
// 分页参数 page: 0, size: 10, sort=id%2Cdesc
|
String pageParam = request.getParameter("page");
|
String sizeParam = request.getParameter("size");
|
String[] sortParam = request.getParameterValues("sort");
|
Page<?> page = new Page<>();
|
if (StringUtil.isNotBlank(pageParam)) {
|
page.setCurrent(Long.parseLong(pageParam));
|
}
|
if (StringUtil.isNotBlank(sizeParam)) {
|
page.setSize(Long.parseLong(sizeParam));
|
}
|
if (ObjectUtil.isEmpty(sortParam)) {
|
return page;
|
}
|
for (String param : sortParam) {
|
if (StringUtil.isBlank(param)) {
|
continue;
|
}
|
String[] split = param.split(StringPool.COMMA);
|
// 清理字符串
|
OrderItem orderItem = new OrderItem();
|
orderItem.setColumn(StringUtil.cleanIdentifier(split[0]));
|
orderItem.setAsc(isOrderAsc(split));
|
page.addOrder(orderItem);
|
}
|
return page;
|
}
|
|
private static boolean isOrderAsc(String[] split) {
|
// 默认 desc
|
if (split.length < 2) {
|
return false;
|
}
|
return ORDER_ASC.equalsIgnoreCase(split[1]);
|
}
|
}
|