feat: 完成数据中心转发网关核心功能(真实联调通过)

核心功能(已连接真实源服务器验证):
- /sys/watchUserLogin 本地处理:RSA解密验证设备密码(防伪造) + 单飞换token + Redis缓存
- 业务接口经本地通配Controller手动HttpUtils透传至源服务器 + 401检测清缓存
- token失效三重自愈:10秒探活 + 预过期刷新 + 被动401兜底

配置隔离(dotenv风格)+ 安全:
- .env 存敏感信息不入库;app.yml 用 ${KEY} 占位符引用;EnvLoader启动前加载
- 移除fastjson(规避0day),JSON改用Solon内置snack4

联调修复多个Solon实际API问题(配置文件名/YAML插件/打包/redisx/注解路径等)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-08-05 15:32:17 +08:00
co-authored by Claude
parent 159d6362af
commit 020f112124
20 changed files with 1196 additions and 0 deletions
+22
View File
@@ -0,0 +1,22 @@
---
name: solon-pitfalls
description: Solon框架的正确API用法(redisx/定时任务/HTTP/注解/配置文件/打包),踩坑后实测确认
metadata:
type: reference
---
联调实测确认的 Solon 4.0.4 正确用法(多次踩坑后验证,务必牢记):
- **配置文件名**:Solon 默认读 `app.yml`**不是** `application.yml`。配置文件名错会导致所有配置读不到(null)。
- **YAML 插件**:默认只读 .properties,需加 `org.noear:solon-config-yaml` 依赖才能读 .yml,否则报 `profile is not supported`
- **打包插件**:用 `org.noear:solon-maven-plugin`repackage 目标),**不要用** maven-assembly-plugin(版本号易错,且非 Solon 标配)。插件版本用 3.10.5(与 solon 主框架 4.0.4 不同版本线)。
- **日志**:需加 `slf4j-simple` 实现,否则 SLF4J 退化为 NOP 无日志。
- **Redisredisx)**:是独立库,无自动注入。手动 `new RedisClient(Properties)`Properties key 为 `server`/`db`/`password`/`user`/`maxTotal`。**不要**用 `@Inject("${redis}") RedisClient`。API`getBucket().store/get``open(session -> session.key(k).delete())`
- **定时任务注解**`@Scheduled`/`@EnableScheduling``org.noear.solon.scheduling.annotation`(来自 `solon-scheduling` 依赖,非 `solon-scheduling-simple`)。
- **Context**:路径 `org.noear.solon.core.handle.Context`(非 `org.noear.solon.core.Context`)。方法:`path()``queryString()``method()``body()``headerNames()``header(name)``status(int)``headerSet(k,v)``output(String)`
- **HTTP 客户端**`solon-net-httputils``HttpUtils.http(url).exec(method)` 返回 HttpResponse。状态码 `resp.code()`(非 status)。body 用 `bodyOfJson(String)`(无 `body(String)` 单参重载,只有 `body(byte[])`/`body(content,contentType)`)。响应体 `resp.bodyAsString()`
- **占位符**`${KEY}` 能解析 `System.setProperty` 注入的值(联调验证)。
- **JSON 返回**Controller 返回 HashMap 会被 snack4 序列化为 `{key=value}` 非标准 JSON。返回标准 JSON 用 snack4 ONode`new ONode().asObject()` + `.set(k,v)`+ `@Produces("application/json")`。**不使用 fastjson**(规避 0day 漏洞),JSON 处理统一用 Solon 内置 snack4`org.noear.snack4.ONode`)。
- **snack4 API**:解析 `ONode.ofJson(str)`;取值 `node.getOrNull(key).getString()`/`.getLong()`;构造对象 `new ONode().asObject().set(k,v)`;序列化 `ONode.serialize(obj)``node.toJson()`
关联 [[architecture-local-passthrough]]、[[jeecg-token-mechanism]]。