{
-
- /**
- * 自定义 Undertow 配置
- *
- * 主要配置内容包括:
- * 1. 配置 WebSocket 部署信息
- * 2. 在虚拟线程模式下使用虚拟线程池
- * 3. 禁用不安全的 HTTP 方法,如 CONNECT、TRACE、TRACK
- *
- *
- * @param factory Undertow 的 Web 服务器工厂
- */
- @Override
- public void customize(UndertowServletWebServerFactory factory) {
- factory.addDeploymentInfoCustomizers(deploymentInfo -> {
- // 配置 WebSocket 部署信息,设置 WebSocket 使用的缓冲区池
- WebSocketDeploymentInfo webSocketDeploymentInfo = new WebSocketDeploymentInfo();
- webSocketDeploymentInfo.setBuffers(new DefaultByteBufferPool(true, 1024));
- deploymentInfo.addServletContextAttribute("io.undertow.websockets.jsr.WebSocketDeploymentInfo", webSocketDeploymentInfo);
-
- // 如果启用了虚拟线程,配置 Undertow 使用虚拟线程池
- if (SpringUtils.isVirtual()) {
- // 创建虚拟线程池,线程池前缀为 "undertow-"
- VirtualThreadTaskExecutor executor = new VirtualThreadTaskExecutor("undertow-");
- // 设置虚拟线程池为执行器和异步执行器
- deploymentInfo.setExecutor(executor);
- deploymentInfo.setAsyncExecutor(executor);
- }
-
- // 配置禁止某些不安全的 HTTP 方法(如 CONNECT、TRACE、TRACK)
- deploymentInfo.addInitialHandlerChainWrapper(handler -> {
- // 禁止三个方法 CONNECT/TRACE/TRACK 也是不安全的 避免爬虫骚扰
- HttpString[] disallowedHttpMethods = {
- HttpString.tryFromString("CONNECT"),
- HttpString.tryFromString("TRACE"),
- HttpString.tryFromString("TRACK")
- };
- // 使用 DisallowedMethodsHandler 拦截并拒绝这些方法的请求
- return new DisallowedMethodsHandler(handler, disallowedHttpMethods);
- });
- });
- }
-
-}
+//package org.dromara.common.web.config;
+//
+//import io.undertow.server.DefaultByteBufferPool;
+//import io.undertow.server.handlers.DisallowedMethodsHandler;
+//import io.undertow.util.HttpString;
+//import io.undertow.websockets.jsr.WebSocketDeploymentInfo;
+//import org.dromara.common.core.utils.SpringUtils;
+//import org.springframework.boot.autoconfigure.AutoConfiguration;
+//import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+//import org.springframework.boot.web.server.WebServerFactoryCustomizer;
+//import org.springframework.core.task.VirtualThreadTaskExecutor;
+//
+///**
+// * Undertow 自定义配置
+// *
+// * @author Lion Li
+// */
+//@AutoConfiguration
+//public class UndertowConfig implements WebServerFactoryCustomizer {
+//
+// /**
+// * 自定义 Undertow 配置
+// *
+// * 主要配置内容包括:
+// * 1. 配置 WebSocket 部署信息
+// * 2. 在虚拟线程模式下使用虚拟线程池
+// * 3. 禁用不安全的 HTTP 方法,如 CONNECT、TRACE、TRACK
+// *
+// *
+// * @param factory Undertow 的 Web 服务器工厂
+// */
+// @Override
+// public void customize(UndertowServletWebServerFactory factory) {
+// factory.addDeploymentInfoCustomizers(deploymentInfo -> {
+// // 配置 WebSocket 部署信息,设置 WebSocket 使用的缓冲区池
+// WebSocketDeploymentInfo webSocketDeploymentInfo = new WebSocketDeploymentInfo();
+// webSocketDeploymentInfo.setBuffers(new DefaultByteBufferPool(true, 1024));
+// deploymentInfo.addServletContextAttribute("io.undertow.websockets.jsr.WebSocketDeploymentInfo", webSocketDeploymentInfo);
+//
+// // 如果启用了虚拟线程,配置 Undertow 使用虚拟线程池
+// if (SpringUtils.isVirtual()) {
+// // 创建虚拟线程池,线程池前缀为 "undertow-"
+// VirtualThreadTaskExecutor executor = new VirtualThreadTaskExecutor("undertow-");
+// // 设置虚拟线程池为执行器和异步执行器
+// deploymentInfo.setExecutor(executor);
+// deploymentInfo.setAsyncExecutor(executor);
+// }
+//
+// // 配置禁止某些不安全的 HTTP 方法(如 CONNECT、TRACE、TRACK)
+// deploymentInfo.addInitialHandlerChainWrapper(handler -> {
+// // 禁止三个方法 CONNECT/TRACE/TRACK 也是不安全的 避免爬虫骚扰
+// HttpString[] disallowedHttpMethods = {
+// HttpString.tryFromString("CONNECT"),
+// HttpString.tryFromString("TRACE"),
+// HttpString.tryFromString("TRACK")
+// };
+// // 使用 DisallowedMethodsHandler 拦截并拒绝这些方法的请求
+// return new DisallowedMethodsHandler(handler, disallowedHttpMethods);
+// });
+// });
+// }
+//
+//}
diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java
index 7a5d82c3e..c59f0f2ac 100644
--- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java
+++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java
@@ -2,7 +2,6 @@ package org.dromara.common.web.handler;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpStatus;
-import com.fasterxml.jackson.core.JsonParseException;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.ConstraintViolation;
@@ -14,6 +13,7 @@ import org.dromara.common.core.exception.SseException;
import org.dromara.common.core.exception.base.BaseException;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.json.utils.JsonUtils;
+import org.springframework.boot.json.JsonParseException;
import org.springframework.context.MessageSourceResolvable;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.expression.ExpressionException;
diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/interceptor/PlusWebInvokeTimeInterceptor.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/interceptor/PlusWebInvokeTimeInterceptor.java
index b56cec1f5..e3f26c8fb 100644
--- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/interceptor/PlusWebInvokeTimeInterceptor.java
+++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/interceptor/PlusWebInvokeTimeInterceptor.java
@@ -4,10 +4,6 @@ import cn.hutool.core.io.IoUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
@@ -19,6 +15,10 @@ import org.dromara.common.web.filter.RepeatedlyRequestWrapper;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.json.JsonMapper;
+import tools.jackson.databind.node.ArrayNode;
+import tools.jackson.databind.node.ObjectNode;
import java.util.HashSet;
import java.util.LinkedHashMap;
@@ -45,8 +45,8 @@ public class PlusWebInvokeTimeInterceptor implements HandlerInterceptor {
if (request instanceof RepeatedlyRequestWrapper) {
jsonParam = IoUtil.read(request.getReader());
if (StringUtils.isNotBlank(jsonParam)) {
- ObjectMapper objectMapper = JsonUtils.getObjectMapper();
- JsonNode rootNode = objectMapper.readTree(jsonParam);
+ JsonMapper jsonMapper = JsonUtils.getJsonMapper();
+ JsonNode rootNode = jsonMapper.readTree(jsonParam);
removeSensitiveFields(rootNode, SystemConstants.EXCLUDE_PROPERTIES);
jsonParam = rootNode.toString();
}
@@ -79,14 +79,14 @@ public class PlusWebInvokeTimeInterceptor implements HandlerInterceptor {
ObjectNode objectNode = (ObjectNode) node;
// 收集要删除的字段名(避免 ConcurrentModification)
Set fieldsToRemove = new HashSet<>();
- objectNode.fieldNames().forEachRemaining(fieldName -> {
+ objectNode.propertyNames().forEach(fieldName -> {
if (ArrayUtil.contains(excludeProperties, fieldName)) {
fieldsToRemove.add(fieldName);
}
});
fieldsToRemove.forEach(objectNode::remove);
// 递归处理子节点
- objectNode.elements().forEachRemaining(child -> removeSensitiveFields(child, excludeProperties));
+ objectNode.values().forEach(child -> removeSensitiveFields(child, excludeProperties));
} else if (node.isArray()) {
ArrayNode arrayNode = (ArrayNode) node;
for (JsonNode child : arrayNode) {
diff --git a/ruoyi-common/ruoyi-common-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
index fc10a36f7..7299472a0 100644
--- a/ruoyi-common/ruoyi-common-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ b/ruoyi-common/ruoyi-common-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -2,4 +2,3 @@ org.dromara.common.web.config.CaptchaConfig
org.dromara.common.web.config.FilterConfig
org.dromara.common.web.config.I18nConfig
org.dromara.common.web.config.ResourcesConfig
-org.dromara.common.web.config.UndertowConfig
diff --git a/ruoyi-extend/ruoyi-monitor-admin/pom.xml b/ruoyi-extend/ruoyi-monitor-admin/pom.xml
index 538ffbd9f..66fcb3c60 100644
--- a/ruoyi-extend/ruoyi-monitor-admin/pom.xml
+++ b/ruoyi-extend/ruoyi-monitor-admin/pom.xml
@@ -26,7 +26,7 @@
org.springframework.boot
- spring-boot-starter-undertow
+ spring-boot-starter-jetty
diff --git a/ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/server/common/register/ServerRegister.java b/ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/server/common/register/ServerRegister.java
deleted file mode 100644
index 2a8a47aa4..000000000
--- a/ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/server/common/register/ServerRegister.java
+++ /dev/null
@@ -1,146 +0,0 @@
-package com.aizuda.snailjob.server.common.register;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.util.IdUtil;
-import cn.hutool.core.util.StrUtil;
-import com.aizuda.snailjob.common.core.enums.NodeTypeEnum;
-import com.aizuda.snailjob.common.core.util.JsonUtil;
-import com.aizuda.snailjob.common.core.util.NetUtil;
-import com.aizuda.snailjob.common.core.util.SnailJobVersion;
-import com.aizuda.snailjob.common.core.util.StreamUtils;
-import com.aizuda.snailjob.common.log.SnailJobLog;
-import com.aizuda.snailjob.server.common.cache.CacheConsumerGroup;
-import com.aizuda.snailjob.server.common.config.SystemProperties;
-import com.aizuda.snailjob.server.common.convert.RegisterNodeInfoConverter;
-import com.aizuda.snailjob.server.common.dto.ServerNodeExtAttrs;
-import com.aizuda.snailjob.server.common.handler.InstanceManager;
-import com.aizuda.snailjob.template.datasource.persistence.po.ServerNode;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.google.common.collect.Lists;
-import lombok.RequiredArgsConstructor;
-import org.springframework.boot.autoconfigure.web.ServerProperties;
-import org.springframework.stereotype.Component;
-
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-
-/**
- * 服务端注册
- *
- * @author opensnail
- * @date 2023-06-07
- * @since 1.6.0
- */
-@Component(ServerRegister.BEAN_NAME)
-@RequiredArgsConstructor
-public class ServerRegister extends AbstractRegister {
- public static final String BEAN_NAME = "serverRegister";
- private final ScheduledExecutorService serverRegisterNode = Executors.newSingleThreadScheduledExecutor(r -> new Thread(r, "server-register-node"));
- public static final int DELAY_TIME = 30;
- public static final String CURRENT_CID;
- public static final String GROUP_NAME = "DEFAULT_SERVER";
- public static final String NAMESPACE_ID = "DEFAULT_SERVER_NAMESPACE_ID";
- private final InstanceManager instanceManager;
- private final SystemProperties systemProperties;
- private final ServerProperties serverProperties;
-
- static {
- CURRENT_CID = IdUtil.getSnowflakeNextIdStr();
- }
-
- @Override
- public boolean supports(int type) {
- return getNodeType().equals(type);
- }
-
- @Override
- protected void beforeProcessor(RegisterContext context) {
- // 新增扩展参数
- ServerNodeExtAttrs serverNodeExtAttrs = new ServerNodeExtAttrs();
- serverNodeExtAttrs.setWebPort(serverProperties.getPort());
- serverNodeExtAttrs.setSystemVersion(SnailJobVersion.getVersion());
-
- context.setGroupName(GROUP_NAME);
- context.setHostId(CURRENT_CID);
- String serverHost = systemProperties.getServerHost();
- if (StrUtil.isEmptyIfStr(serverHost)) {
- serverHost = NetUtil.getLocalIpStr();
- }
- context.setHostIp(serverHost);
- context.setHostPort(systemProperties.getServerPort());
- context.setContextPath(Optional.ofNullable(serverProperties.getServlet().getContextPath()).orElse(StrUtil.EMPTY));
- context.setNamespaceId(NAMESPACE_ID);
- context.setExtAttrs(JsonUtil.toJsonString(serverNodeExtAttrs));
- }
-
- @Override
- protected LocalDateTime getExpireAt() {
- return LocalDateTime.now().plusSeconds(DELAY_TIME);
- }
-
- @Override
- protected boolean doRegister(RegisterContext context, ServerNode serverNode) {
- refreshExpireAt(Lists.newArrayList(serverNode));
- return Boolean.TRUE;
- }
-
-
- @Override
- protected void afterProcessor(final ServerNode serverNode) {
- try {
- // 同步当前POD消费的组的节点信息
- // netty的client只会注册到一个服务端,若组分配的和client连接的不是一个POD则会导致当前POD没有其他客户端的注册信息
- ConcurrentMap/*namespaceId*/> allConsumerGroupName = CacheConsumerGroup.getAllConsumerGroupName();
- if (CollUtil.isNotEmpty(allConsumerGroupName)) {
- Set namespaceIdSets = StreamUtils.toSetByFlatMap(allConsumerGroupName.values(), Set::stream);
- if (CollUtil.isEmpty(namespaceIdSets)) {
- return;
- }
-
- List serverNodes = serverNodeMapper.selectList(
- new LambdaQueryWrapper()
- .eq(ServerNode::getNodeType, NodeTypeEnum.CLIENT.getType())
- .in(ServerNode::getNamespaceId, namespaceIdSets)
- .in(ServerNode::getGroupName, allConsumerGroupName.keySet()));
- for (final ServerNode node : serverNodes) {
- // 刷新全量本地缓存
- instanceManager.registerOrUpdate(RegisterNodeInfoConverter.INSTANCE.toRegisterNodeInfo(node));
- // 刷新过期时间
- CacheConsumerGroup.addOrUpdate(node.getGroupName(), node.getNamespaceId());
- }
- }
- } catch (Exception e) {
- SnailJobLog.LOCAL.error("Client refresh failed", e);
- }
- }
-
- @Override
- protected Integer getNodeType() {
- return NodeTypeEnum.SERVER.getType();
- }
-
- @Override
- public void start() {
- SnailJobLog.LOCAL.info("ServerRegister start");
-
- serverRegisterNode.scheduleAtFixedRate(() -> {
- try {
- this.register(new RegisterContext());
- } catch (Exception e) {
- SnailJobLog.LOCAL.error("Server-side registration failed", e);
- }
- }, 0, DELAY_TIME * 2 / 3, TimeUnit.SECONDS);
-
- }
-
- @Override
- public void close() {
- SnailJobLog.LOCAL.info("ServerRegister close");
- }
-}