xiejun
2024-11-01 80b6cbfc9c861469146318d0b3dd5f8b8b525b8a
Source/BladeX-Tool/blade-starter-mybatis/src/main/java/org/springblade/core/mp/resolver/PageArgumentResolver.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,75 @@
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]);
   }
}