From 6ff8ca2526e945f751c1f2b22a74baf89ebc5835 Mon Sep 17 00:00:00 2001 From: lijiahang Date: Fri, 29 Dec 2023 19:15:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=BB=E6=9C=BA=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E5=A4=84=E7=90=86=E5=99=A8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/constant/ExtraFieldConst.java | 2 + .../ops/framework/common/utils/Requests.java | 12 +++ .../websocket/core/constant/WsCloseCode.java | 24 +++++- .../core/handler/TextWebSocketHandler.java | 49 ++++++++++++ .../config/AssetWebSocketConfiguration.java | 12 +-- .../terminal/TerminalDispatchHandler.java | 52 ------------- .../terminal/TerminalMessageDispatcher.java | 75 +++++++++++++++++++ .../host/terminal/entity/MessageWrapper.java | 36 +++++++++ .../request/TerminalConnectRequest.java | 28 +++++++ .../response/TerminalConnectResponse.java | 28 +++++++ .../terminal/enums/InputOperatorTypeEnum.java | 63 ++++++++++++++++ .../enums/OutputOperatorTypeEnum.java | 58 ++++++++++++++ .../handler/AbstractTerminalHandler.java | 39 ++++++++++ .../terminal/handler/ITerminalHandler.java | 22 ++++++ .../handler/TerminalConnectHandler.java | 29 +++++++ ...or.java => TerminalAccessInterceptor.java} | 27 +++---- 16 files changed, 483 insertions(+), 73 deletions(-) create mode 100644 orion-ops-framework/orion-ops-spring-boot-starter-websocket/src/main/java/com/orion/ops/framework/websocket/core/handler/TextWebSocketHandler.java delete mode 100644 orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/TerminalDispatchHandler.java create mode 100644 orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/TerminalMessageDispatcher.java create mode 100644 orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/entity/MessageWrapper.java create mode 100644 orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/entity/request/TerminalConnectRequest.java create mode 100644 orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/entity/response/TerminalConnectResponse.java create mode 100644 orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/enums/InputOperatorTypeEnum.java create mode 100644 orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/enums/OutputOperatorTypeEnum.java create mode 100644 orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/AbstractTerminalHandler.java create mode 100644 orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/ITerminalHandler.java create mode 100644 orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalConnectHandler.java rename orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/interceptor/{TerminalInterceptor.java => TerminalAccessInterceptor.java} (63%) diff --git a/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/ExtraFieldConst.java b/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/ExtraFieldConst.java index cc1e40d3..e93f7579 100644 --- a/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/ExtraFieldConst.java +++ b/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/ExtraFieldConst.java @@ -13,6 +13,8 @@ public interface ExtraFieldConst extends FieldConst { String TRACE_ID = "traceId"; + String IDENTITY = "identity"; + String GROUP_NAME = "groupName"; String ID_LIST = "idList"; diff --git a/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/utils/Requests.java b/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/utils/Requests.java index 4442fa0e..3f2ba28f 100644 --- a/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/utils/Requests.java +++ b/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/utils/Requests.java @@ -1,6 +1,7 @@ package com.orion.ops.framework.common.utils; import com.orion.ops.framework.common.entity.RequestIdentity; +import com.orion.ops.framework.common.entity.RequestIdentityModel; import com.orion.web.servlet.web.Servlets; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @@ -19,6 +20,17 @@ public class Requests { private Requests() { } + /** + * 获取请求留痕信息 + * + * @return model + */ + public static RequestIdentityModel getIdentity() { + RequestIdentityModel model = new RequestIdentityModel(); + fillIdentity(model); + return model; + } + /** * 填充请求留痕信息 * diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-websocket/src/main/java/com/orion/ops/framework/websocket/core/constant/WsCloseCode.java b/orion-ops-framework/orion-ops-spring-boot-starter-websocket/src/main/java/com/orion/ops/framework/websocket/core/constant/WsCloseCode.java index c5a32480..3f950cb2 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-websocket/src/main/java/com/orion/ops/framework/websocket/core/constant/WsCloseCode.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-websocket/src/main/java/com/orion/ops/framework/websocket/core/constant/WsCloseCode.java @@ -2,16 +2,20 @@ package com.orion.ops.framework.websocket.core.constant; import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.socket.CloseStatus; +import org.springframework.web.socket.WebSocketSession; /** - * ws服务端关闭code + * ws 服务端关闭 code * * @author Jiahang Li * @version 1.0.0 * @since 2021/6/16 15:18 */ -@AllArgsConstructor +@Slf4j @Getter +@AllArgsConstructor public enum WsCloseCode { /** @@ -125,6 +129,22 @@ public enum WsCloseCode { private final String reason; + /** + * 关闭会话 + * + * @param session session + */ + public void close(WebSocketSession session) { + if (!session.isOpen()) { + return; + } + try { + session.close(new CloseStatus(code, reason)); + } catch (Exception e) { + log.error("websocket close failure", e); + } + } + public static WsCloseCode of(int code) { for (WsCloseCode value : values()) { if (value.code == code) { diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-websocket/src/main/java/com/orion/ops/framework/websocket/core/handler/TextWebSocketHandler.java b/orion-ops-framework/orion-ops-spring-boot-starter-websocket/src/main/java/com/orion/ops/framework/websocket/core/handler/TextWebSocketHandler.java new file mode 100644 index 00000000..65b24e03 --- /dev/null +++ b/orion-ops-framework/orion-ops-spring-boot-starter-websocket/src/main/java/com/orion/ops/framework/websocket/core/handler/TextWebSocketHandler.java @@ -0,0 +1,49 @@ +package com.orion.ops.framework.websocket.core.handler; + +import org.springframework.web.socket.*; + +/** + * 文本类型消息处理器 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/12/29 18:23 + */ +public abstract class TextWebSocketHandler implements WebSocketHandler { + + @Override + public void afterConnectionEstablished(WebSocketSession session) { + } + + @Override + public void handleMessage(WebSocketSession session, WebSocketMessage message) { + // 非 text message 不处理 + if (!(message instanceof TextMessage)) { + return; + } + // 处理消息 + this.onMessage(session, (String) message.getPayload()); + } + + /** + * 处理消息 + * + * @param session session + * @param payload payload + */ + public abstract void onMessage(WebSocketSession session, String payload); + + @Override + public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { + } + + @Override + public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { + } + + @Override + public boolean supportsPartialMessages() { + return false; + } + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/config/AssetWebSocketConfiguration.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/config/AssetWebSocketConfiguration.java index 29b8a79b..b25e93b2 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/config/AssetWebSocketConfiguration.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/config/AssetWebSocketConfiguration.java @@ -1,7 +1,7 @@ package com.orion.ops.module.asset.config; -import com.orion.ops.module.asset.handler.host.terminal.TerminalDispatchHandler; -import com.orion.ops.module.asset.interceptor.TerminalInterceptor; +import com.orion.ops.module.asset.handler.host.terminal.TerminalMessageDispatcher; +import com.orion.ops.module.asset.interceptor.TerminalAccessInterceptor; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.config.annotation.WebSocketConfigurer; @@ -23,16 +23,16 @@ public class AssetWebSocketConfiguration implements WebSocketConfigurer { private String prefix; @Resource - private TerminalInterceptor terminalInterceptor; + private TerminalAccessInterceptor terminalAccessInterceptor; @Resource - private TerminalDispatchHandler terminalDispatchHandler; + private TerminalMessageDispatcher terminalMessageDispatcher; @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { // 终端 - registry.addHandler(terminalDispatchHandler, prefix + "/host/terminal/{token}") - .addInterceptors(terminalInterceptor) + registry.addHandler(terminalMessageDispatcher, prefix + "/host/terminal/{token}") + .addInterceptors(terminalAccessInterceptor) .setAllowedOrigins("*"); } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/TerminalDispatchHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/TerminalDispatchHandler.java deleted file mode 100644 index e53e1670..00000000 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/TerminalDispatchHandler.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.orion.ops.module.asset.handler.host.terminal; - -import com.orion.ops.framework.biz.operator.log.core.service.OperatorLogFrameworkService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.springframework.web.socket.CloseStatus; -import org.springframework.web.socket.WebSocketHandler; -import org.springframework.web.socket.WebSocketMessage; -import org.springframework.web.socket.WebSocketSession; - -import javax.annotation.Resource; - -/** - * 终端处理器 - * - * @author Jiahang Li - * @version 1.0.0 - * @since 2023/12/28 14:33 - */ -@Slf4j -@Component -public class TerminalDispatchHandler implements WebSocketHandler { - - @Resource - private OperatorLogFrameworkService operatorLogFrameworkService; - - @Override - public void afterConnectionEstablished(WebSocketSession session) throws Exception { - log.info("afterConnectionEstablished"); - } - - @Override - public void handleMessage(WebSocketSession session, WebSocketMessage message) throws Exception { - log.info("handleMessage"); - } - - @Override - public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { - log.info("handleTransportError"); - } - - @Override - public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { - log.info("afterConnectionClosed"); - } - - @Override - public boolean supportsPartialMessages() { - return false; - } - -} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/TerminalMessageDispatcher.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/TerminalMessageDispatcher.java new file mode 100644 index 00000000..f54201c8 --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/TerminalMessageDispatcher.java @@ -0,0 +1,75 @@ +package com.orion.ops.module.asset.handler.host.terminal; + +import com.alibaba.fastjson.JSON; +import com.orion.ops.framework.websocket.core.handler.TextWebSocketHandler; +import com.orion.ops.module.asset.handler.host.terminal.entity.MessageWrapper; +import com.orion.ops.module.asset.handler.host.terminal.enums.InputOperatorTypeEnum; +import com.orion.ops.module.asset.handler.host.terminal.handler.TerminalConnectHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.web.socket.CloseStatus; +import org.springframework.web.socket.WebSocketSession; + +import javax.annotation.Resource; +import java.util.Optional; + +/** + * 终端处理器 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/12/28 14:33 + */ +@Slf4j +@Component +public class TerminalMessageDispatcher extends TextWebSocketHandler { + + @Resource + private TerminalConnectHandler terminalConnectHandler; + + @Override + public void onMessage(WebSocketSession session, String payload) { + try { + // 解析类型 + InputOperatorTypeEnum type = Optional.ofNullable(payload) + .map(s -> JSON.parseObject(s, MessageWrapper.class)) + .map(MessageWrapper::getType) + .map(InputOperatorTypeEnum::of) + .orElse(null); + if (InputOperatorTypeEnum.CONNECT.equals(type)) { + // 连接主机 + // {"t":"co","s": "1001","b":{"h":1}} + terminalConnectHandler.process(session, payload); + } else if (InputOperatorTypeEnum.CLOSE.equals(type)) { + // 关闭连接 + + } else if (InputOperatorTypeEnum.PING.equals(type)) { + // ping + + } else if (InputOperatorTypeEnum.RESIZE.equals(type)) { + // resize + + } else if (InputOperatorTypeEnum.EXEC.equals(type)) { + // 执行 + + } else if (InputOperatorTypeEnum.INPUT.equals(type)) { + // 输入 + + } + } catch (Exception e) { + log.error("TerminalDispatchHandler-handleMessage-error msg: {}", payload, e); + } + } + + @Override + public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { + log.info("handleTransportError"); + } + + @Override + public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { + log.info("afterConnectionClosed"); + // release session + } + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/entity/MessageWrapper.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/entity/MessageWrapper.java new file mode 100644 index 00000000..ba980878 --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/entity/MessageWrapper.java @@ -0,0 +1,36 @@ +package com.orion.ops.module.asset.handler.host.terminal.entity; + +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 消息体包装 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/12/29 16:24 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Schema(name = "MessageWrapper", description = "消息体包装") +public class MessageWrapper { + + @JSONField(name = "s") + @Schema(description = "会话id") + private String session; + + @JSONField(name = "t") + @Schema(description = "消息类型") + private String type; + + @JSONField(name = "b") + @Schema(description = "消息体") + private T body; + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/entity/request/TerminalConnectRequest.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/entity/request/TerminalConnectRequest.java new file mode 100644 index 00000000..f98bd258 --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/entity/request/TerminalConnectRequest.java @@ -0,0 +1,28 @@ +package com.orion.ops.module.asset.handler.host.terminal.entity.request; + +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 终端连接请求 实体对象 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/12/29 16:20 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Schema(name = "TerminalConnectRequest", description = "终端连接请求 实体对象") +public class TerminalConnectRequest { + + @JSONField(name = "h") + @Schema(description = "主机id") + private String hostId; + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/entity/response/TerminalConnectResponse.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/entity/response/TerminalConnectResponse.java new file mode 100644 index 00000000..e35ef6ae --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/entity/response/TerminalConnectResponse.java @@ -0,0 +1,28 @@ +package com.orion.ops.module.asset.handler.host.terminal.entity.response; + +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 终端连接响应 实体对象 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/12/29 16:20 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Schema(name = "TerminalConnectResponse", description = "终端连接响应 实体对象") +public class TerminalConnectResponse { + + @JSONField(name = "s") + @Schema(description = "会话id") + private String s; + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/enums/InputOperatorTypeEnum.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/enums/InputOperatorTypeEnum.java new file mode 100644 index 00000000..87ee70ae --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/enums/InputOperatorTypeEnum.java @@ -0,0 +1,63 @@ +package com.orion.ops.module.asset.handler.host.terminal.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 输入操作类型枚举 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/12/29 15:33 + */ +@Getter +@AllArgsConstructor +public enum InputOperatorTypeEnum { + + /** + * 连接主机 + */ + CONNECT("co"), + + /** + * 关闭连接 + */ + CLOSE("cl"), + + /** + * ping + */ + PING("p"), + + /** + * 修改大小 + */ + RESIZE("rs"), + + /** + * 执行 + */ + EXEC("e"), + + /** + * 输入 + */ + INPUT("i"), + + ; + + private final String type; + + public static InputOperatorTypeEnum of(String type) { + if (type == null) { + return null; + } + for (InputOperatorTypeEnum value : values()) { + if (value.type.equals(type)) { + return value; + } + } + return null; + } + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/enums/OutputOperatorTypeEnum.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/enums/OutputOperatorTypeEnum.java new file mode 100644 index 00000000..283d2428 --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/enums/OutputOperatorTypeEnum.java @@ -0,0 +1,58 @@ +package com.orion.ops.module.asset.handler.host.terminal.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 输出操作类型枚举 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/12/29 15:33 + */ +@Getter +@AllArgsConstructor +public enum OutputOperatorTypeEnum { + + /** + * 连接主机成功 + */ + CONNECT_COMPLETE("cc"), + + /** + * 连接主机失败 + */ + CONNECT_FAILED("cf"), + + /** + * pong + */ + PONG("p"), + + /** + * 输出 + */ + OUTPUT("o"), + + /** + * 发生错误 + */ + ERROR("e"), + + ; + + private final String type; + + public static OutputOperatorTypeEnum of(String type) { + if (type == null) { + return null; + } + for (OutputOperatorTypeEnum value : values()) { + if (value.type.equals(type)) { + return value; + } + } + return null; + } + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/AbstractTerminalHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/AbstractTerminalHandler.java new file mode 100644 index 00000000..b435185f --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/AbstractTerminalHandler.java @@ -0,0 +1,39 @@ +package com.orion.ops.module.asset.handler.host.terminal.handler; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.TypeReference; +import com.orion.ops.module.asset.handler.host.terminal.entity.MessageWrapper; +import org.springframework.web.socket.WebSocketSession; + +/** + * 终端消息处理器 基类 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/12/29 18:59 + */ +public abstract class AbstractTerminalHandler implements ITerminalHandler { + + /** + * 类型转换器 + */ + private final TypeReference> convert; + + public AbstractTerminalHandler(TypeReference> convert) { + this.convert = convert; + } + + @Override + public void process(WebSocketSession session, String payload) { + this.onMessage(session, JSON.parseObject(payload, convert)); + } + + /** + * 处理消息 + * + * @param session session + * @param msg msg + */ + protected abstract void onMessage(WebSocketSession session, MessageWrapper msg); + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/ITerminalHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/ITerminalHandler.java new file mode 100644 index 00000000..3f770d1a --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/ITerminalHandler.java @@ -0,0 +1,22 @@ +package com.orion.ops.module.asset.handler.host.terminal.handler; + +import org.springframework.web.socket.WebSocketSession; + +/** + * 终端消息处理器 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/12/29 18:53 + */ +public interface ITerminalHandler { + + /** + * 处理消息 + * + * @param session session + * @param payload payload + */ + void process(WebSocketSession session, String payload); + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalConnectHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalConnectHandler.java new file mode 100644 index 00000000..780e40ff --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalConnectHandler.java @@ -0,0 +1,29 @@ +package com.orion.ops.module.asset.handler.host.terminal.handler; + +import com.alibaba.fastjson.TypeReference; +import com.orion.ops.module.asset.handler.host.terminal.entity.MessageWrapper; +import com.orion.ops.module.asset.handler.host.terminal.entity.request.TerminalConnectRequest; +import org.springframework.stereotype.Component; +import org.springframework.web.socket.WebSocketSession; + +/** + * 连接主机处理器 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/12/29 15:32 + */ +@Component +public class TerminalConnectHandler extends AbstractTerminalHandler { + + public TerminalConnectHandler() { + super(new TypeReference>(TerminalConnectRequest.class) { + }); + } + + @Override + protected void onMessage(WebSocketSession session, MessageWrapper msg) { + System.out.println(msg); + } + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/interceptor/TerminalInterceptor.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/interceptor/TerminalAccessInterceptor.java similarity index 63% rename from orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/interceptor/TerminalInterceptor.java rename to orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/interceptor/TerminalAccessInterceptor.java index 5ab567b4..50224e03 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/interceptor/TerminalInterceptor.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/interceptor/TerminalAccessInterceptor.java @@ -1,11 +1,9 @@ package com.orion.ops.module.asset.interceptor; import com.orion.lang.utils.Urls; -import com.orion.ops.framework.biz.operator.log.core.model.OperatorLogModel; import com.orion.ops.framework.common.constant.ExtraFieldConst; -import com.orion.ops.framework.common.entity.RequestIdentity; +import com.orion.ops.framework.common.meta.TraceIdHolder; import com.orion.ops.framework.common.utils.Requests; -import com.orion.ops.module.asset.entity.dto.HostTerminalAccessDTO; import com.orion.ops.module.asset.service.HostTerminalService; import lombok.extern.slf4j.Slf4j; import org.springframework.http.server.ServerHttpRequest; @@ -26,7 +24,7 @@ import java.util.Map; */ @Slf4j @Component -public class TerminalInterceptor implements HandshakeInterceptor { +public class TerminalAccessInterceptor implements HandshakeInterceptor { @Resource private HostTerminalService hostTerminalService; @@ -36,16 +34,19 @@ public class TerminalInterceptor implements HandshakeInterceptor { // 获取 token String token = Urls.getUrlSource(request.getURI().getPath()); log.info("TerminalInterceptor-beforeHandshake start token: {}", token); + attributes.put(ExtraFieldConst.USER_ID, 1L); + attributes.put(ExtraFieldConst.TRACE_ID, TraceIdHolder.get()); + attributes.put(ExtraFieldConst.IDENTITY, Requests.getIdentity()); // 获取连接数据 - HostTerminalAccessDTO access = hostTerminalService.getAccessInfoByToken(token); - if (access == null) { - log.error("TerminalInterceptor-beforeHandshake absent token: {}", token); - return false; - } - // 设置参数 - attributes.put(ExtraFieldConst.USER_ID, access.getUserId()); - OperatorLogModel identity = new OperatorLogModel(); - Requests.fillIdentity(identity); + // HostTerminalAccessDTO access = hostTerminalService.getAccessInfoByToken(token); + // if (access == null) { + // log.error("TerminalInterceptor-beforeHandshake absent token: {}", token); + // return false; + // } + // // 设置参数 + // attributes.put(ExtraFieldConst.USER_ID, access.getUserId()); + // attributes.put(ExtraFieldConst.TRACE_ID, TraceIdHolder.get()); + // attributes.put(ExtraFieldConst.IDENTITY, Requests.getIdentity()); return true; }