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();
}