diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/resolver/SqlFilterArgumentResolver.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/resolver/SqlFilterArgumentResolver.java index a0ce13631..41660cf3b 100644 --- a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/resolver/SqlFilterArgumentResolver.java +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/resolver/SqlFilterArgumentResolver.java @@ -46,66 +46,65 @@ import java.util.stream.Collectors; @Slf4j public class SqlFilterArgumentResolver implements HandlerMethodArgumentResolver { - private final static String[] KEYWORDS = { "master", "truncate", "insert", "select", "delete", "update", "declare", - "alter", "drop", "sleep", "extractvalue", "concat" }; - /** - * 判断Controller是否包含page 参数 - * @param parameter 参数 - * @return 是否过滤 - */ - @Override - public boolean supportsParameter(MethodParameter parameter) { - return parameter.getParameterType().equals(Page.class); - } + /** + * 判断Controller是否包含page 参数 + * + * @param parameter 参数 + * @return 是否过滤 + */ + @Override + public boolean supportsParameter(MethodParameter parameter) { + return parameter.getParameterType().equals(Page.class); + } - /** - * @param parameter 入参集合 - * @param mavContainer model 和 view - * @param webRequest web相关 - * @param binderFactory 入参解析 - * @return 检查后新的page对象 - *

- * page 只支持查询 GET .如需解析POST获取请求报文体处理 - */ - @Override - public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, - NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { + /** + * @param parameter 入参集合 + * @param mavContainer model 和 view + * @param webRequest web相关 + * @param binderFactory 入参解析 + * @return 检查后新的page对象 + *

+ * page 只支持查询 GET .如需解析POST获取请求报文体处理 + */ + @Override + public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, + NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { - HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); + HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); - String ascs = request.getParameter("ascs"); - String descs = request.getParameter("descs"); + String ascs = request.getParameter("ascs"); + String descs = request.getParameter("descs"); - String current = request.getParameter("current"); - String size = request.getParameter("size"); + String current = request.getParameter("current"); + String size = request.getParameter("size"); - Page page = new Page(); - if (StrUtil.isNotBlank(current)) { - // 如果current page 小于零 视为不合法数据 - if (CompareUtil.compare(Long.parseLong(current), 0L) < 0) { - throw new CheckedException("current page error"); - } - page.setCurrent(Long.parseLong(current)); - } + Page page = new Page(); + if (StrUtil.isNotBlank(current)) { + // 如果current page 小于零 视为不合法数据 + if (CompareUtil.compare(Long.parseLong(current), 0L) < 0) { + throw new CheckedException("current page error"); + } + page.setCurrent(Long.parseLong(current)); + } - if (StrUtil.isNotBlank(size)) { - page.setSize(Long.parseLong(size)); - } + if (StrUtil.isNotBlank(size)) { + page.setSize(Long.parseLong(size)); + } - List orderItemList = new ArrayList<>(); - Optional.ofNullable(ascs) - .ifPresent(s -> orderItemList.addAll(Arrays.stream(s.split(StrUtil.COMMA)) - .filter(SqlInjectionUtils::check) - .map(OrderItem::asc) - .collect(Collectors.toList()))); - Optional.ofNullable(descs) - .ifPresent(s -> orderItemList.addAll(Arrays.stream(s.split(StrUtil.COMMA)) - .filter(SqlInjectionUtils::check) - .map(OrderItem::desc) - .collect(Collectors.toList()))); - page.addOrder(orderItemList); + List orderItemList = new ArrayList<>(); + Optional.ofNullable(ascs) + .ifPresent(s -> orderItemList.addAll(Arrays.stream(s.split(StrUtil.COMMA)) + .filter(asc -> !SqlInjectionUtils.check(asc)) + .map(OrderItem::asc) + .collect(Collectors.toList()))); + Optional.ofNullable(descs) + .ifPresent(s -> orderItemList.addAll(Arrays.stream(s.split(StrUtil.COMMA)) + .filter(desc -> !SqlInjectionUtils.check(desc)) + .map(OrderItem::desc) + .collect(Collectors.toList()))); + page.addOrder(orderItemList); - return page; - } + return page; + } } diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysRouteConfController.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysRouteConfController.java index 182547743..32c1b6967 100755 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysRouteConfController.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysRouteConfController.java @@ -17,7 +17,10 @@ package com.pig4cloud.pigx.admin.controller; -import cn.hutool.json.JSONArray; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.pig4cloud.pigx.admin.api.entity.SysRouteConf; import com.pig4cloud.pigx.admin.service.SysRouteConfService; import com.pig4cloud.pigx.common.core.util.R; import com.pig4cloud.pigx.common.log.annotation.SysLog; @@ -47,19 +50,26 @@ public class SysRouteConfController { * @return */ @GetMapping - public R listRoutes() { - return R.ok(sysRouteConfService.list()); + public R listRoutes(@RequestParam(required = false) String routeId) { + return R.ok(sysRouteConfService.list(Wrappers.lambdaQuery().eq(StrUtil.isNotBlank(routeId), + SysRouteConf::getRouteId, routeId))); + } + + @DeleteMapping("/{routeId}") + public R deleteRoute(@PathVariable String routeId) { + return R.ok( + sysRouteConfService.remove(Wrappers.lambdaQuery().eq(SysRouteConf::getRouteId, routeId))); } /** - * 修改路由 - * @param routes 路由定义 - * @return + * 新增修改路由 + * @param route 路由定义 + * @return success */ - @SysLog("修改路由") - @PutMapping - public R updateRoutes(@RequestBody JSONArray routes) { - return R.ok(sysRouteConfService.updateRoutes(routes)); + @SysLog("新增修改路由") + @PostMapping + public R addOrUpdateRoute(@RequestBody JSONObject route) { + return R.ok(sysRouteConfService.addOrUpdateRoute(route)); } } diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysRouteConfService.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysRouteConfService.java index c4b8ccc72..0fcd140d2 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysRouteConfService.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysRouteConfService.java @@ -17,7 +17,7 @@ package com.pig4cloud.pigx.admin.service; -import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; import com.baomidou.mybatisplus.extension.service.IService; import com.pig4cloud.pigx.admin.api.entity.SysRouteConf; import reactor.core.publisher.Mono; @@ -32,9 +32,9 @@ public interface SysRouteConfService extends IService { /** * 更新路由信息 - * @param routes 路由信息 + * @param route 路由信息 * @return */ - Mono updateRoutes(JSONArray routes); + Mono addOrUpdateRoute(JSONObject route); } diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysRouteConfServiceImpl.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysRouteConfServiceImpl.java index 52cef406e..13dc0b5a2 100755 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysRouteConfServiceImpl.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysRouteConfServiceImpl.java @@ -17,15 +17,15 @@ package com.pig4cloud.pigx.admin.service.impl; +import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; -import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.pig4cloud.pigx.admin.api.entity.SysRouteConf; import com.pig4cloud.pigx.admin.mapper.SysRouteConfMapper; import com.pig4cloud.pigx.admin.service.SysRouteConfService; -import com.pig4cloud.pigx.common.core.constant.CacheConstants; -import com.pig4cloud.pigx.common.core.constant.CommonConstants; import com.pig4cloud.pigx.common.gateway.support.DynamicRouteInitEvent; import com.pig4cloud.pigx.common.gateway.vo.RouteDefinitionVo; import lombok.AllArgsConstructor; @@ -33,17 +33,13 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.gateway.filter.FilterDefinition; import org.springframework.cloud.gateway.handler.predicate.PredicateDefinition; import org.springframework.context.ApplicationEventPublisher; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import reactor.core.publisher.Mono; import java.net.URI; -import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; /** * @author lengleng @@ -57,107 +53,80 @@ import java.util.stream.Collectors; public class SysRouteConfServiceImpl extends ServiceImpl implements SysRouteConfService { - private final RedisTemplate redisTemplate; - private final ApplicationEventPublisher applicationEventPublisher; /** * 更新路由信息 - * @param routes 路由信息 + * @param route 路由信息 * @return */ @Override @Transactional(rollbackFor = Exception.class) - public Mono updateRoutes(JSONArray routes) { - // 清空Redis 缓存 - Boolean result = redisTemplate.delete(CacheConstants.ROUTE_KEY); - log.info("清空网关路由 {} ", result); - - // 遍历修改的routes,保存到Redis - List routeDefinitionVoList = new ArrayList<>(); - + public Mono addOrUpdateRoute(JSONObject route) { try { - routes.forEach(value -> { - log.info("更新路由 ->{}", value); - RouteDefinitionVo vo = new RouteDefinitionVo(); - Map map = (Map) value; + log.info("更新路由 ->{}", route); + RouteDefinitionVo vo = new RouteDefinitionVo(); - Object id = map.get("routeId"); - if (id != null) { - vo.setId(String.valueOf(id)); - } + String id = route.getStr("routeId"); + if (StrUtil.isNotBlank(id)) { + vo.setId(id); + } - Object routeName = map.get("routeName"); - if (routeName != null) { - vo.setRouteName(String.valueOf(routeName)); - } + String routeName = route.getStr("routeName"); + if (StrUtil.isNotBlank(routeName)) { + vo.setRouteName(routeName); + } - Object predicates = map.get("predicates"); - if (predicates != null) { - JSONArray predicatesArray = (JSONArray) predicates; - List predicateDefinitionList = predicatesArray - .toList(PredicateDefinition.class); - vo.setPredicates(predicateDefinitionList); - } + JSONArray predicates = route.getJSONArray("predicates"); + if (predicates != null) { + List predicateDefinitionList = predicates.toList(PredicateDefinition.class); + vo.setPredicates(predicateDefinitionList); + } - Object filters = map.get("filters"); - if (filters != null) { - JSONArray filtersArray = (JSONArray) filters; - List filterDefinitionList = filtersArray.toList(FilterDefinition.class); - vo.setFilters(filterDefinitionList); - } + JSONArray filters = route.getJSONArray("filters"); + if (filters != null) { + List filterDefinitionList = filters.toList(FilterDefinition.class); + vo.setFilters(filterDefinitionList); + } - Object uri = map.get("uri"); - if (uri != null) { - vo.setUri(URI.create(String.valueOf(uri))); - } + Object uri = route.getStr("uri"); + if (uri != null) { + vo.setUri(URI.create(String.valueOf(uri))); + } - Object order = map.get("order"); - if (order != null) { - vo.setOrder(Integer.parseInt(String.valueOf(order))); - } + Integer order = route.getInt("order"); + if (order != null) { + vo.setOrder(order); + } - Object metadata = map.get("metadata"); - if (metadata != null) { - Map metadataMap = JSONUtil.toBean(String.valueOf(metadata), Map.class); - vo.setMetadata(metadataMap); - } + Map metadataMap = route.getBean("metadata", Map.class); + if (metadataMap != null) { + vo.setMetadata(metadataMap); + } - redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(RouteDefinitionVo.class)); - redisTemplate.opsForHash().put(CacheConstants.ROUTE_KEY, vo.getId(), vo); - routeDefinitionVoList.add(vo); - }); - - // 逻辑删除全部 - SysRouteConf condition = new SysRouteConf(); - condition.setDelFlag(CommonConstants.STATUS_NORMAL); - this.remove(new UpdateWrapper<>(condition)); + // 逻辑删除 ,不直接更新避免危险! + this.remove(Wrappers.lambdaQuery().eq(SysRouteConf::getRouteId, id)); // 插入生效路由 - List routeConfList = routeDefinitionVoList.stream().map(vo -> { - SysRouteConf routeConf = new SysRouteConf(); - routeConf.setRouteId(vo.getId()); - routeConf.setRouteName(vo.getRouteName()); - routeConf.setFilters(JSONUtil.toJsonStr(vo.getFilters())); - routeConf.setPredicates(JSONUtil.toJsonStr(vo.getPredicates())); - routeConf.setSortOrder(vo.getOrder()); - routeConf.setUri(vo.getUri().toString()); - routeConf.setMetadata(JSONUtil.toJsonStr(vo.getMetadata())); - return routeConf; - }).collect(Collectors.toList()); - this.saveBatch(routeConfList); + SysRouteConf routeConf = new SysRouteConf(); + routeConf.setRouteId(vo.getId()); + routeConf.setRouteName(vo.getRouteName()); + routeConf.setFilters(JSONUtil.toJsonStr(vo.getFilters())); + routeConf.setPredicates(JSONUtil.toJsonStr(vo.getPredicates())); + routeConf.setSortOrder(vo.getOrder()); + routeConf.setUri(vo.getUri().toString()); + routeConf.setMetadata(JSONUtil.toJsonStr(vo.getMetadata())); + this.save(routeConf); log.debug("更新网关路由结束 "); - - // 通知网关重置路由 - redisTemplate.convertAndSend(CacheConstants.ROUTE_JVM_RELOAD_TOPIC, "路由信息,网关缓存更新"); } catch (Exception e) { log.error("路由配置解析失败", e); - // 回滚路由,重新加载即可 - this.applicationEventPublisher.publishEvent(new DynamicRouteInitEvent(this)); // 抛出异常 throw new RuntimeException(e); } + finally { + this.applicationEventPublisher.publishEvent(new DynamicRouteInitEvent(this)); + } return Mono.empty(); }