核心功能(已连接真实源服务器验证):
- /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>
4.4 KiB
4.4 KiB
CLAUDE.md — dc-solon-gateway 项目说明
本文件是 Claude Code 在本项目的工作指引。项目代码、约定、关键决策均记录于此。
项目概述
dc-solon-gateway 是数据中心转发网关,作为中转服务器收敛健康设备(手表)的 token 获取请求,规避 HTTP 爆破风控误报。
背景
健康设备众多且共用同一接口账号(watchUser),设备各自向源服务器(jeecg)请求 /sys/watchUserLogin 换 token。因 RSA 加密密码每次密文不同,短时间高频率访问被 WAF 误判为 HTTP 爆破。
解决方案
旧服务器域名指向本中转服务器:
/sys/watchUserLogin→ 本地处理:解密验证设备密码(防伪造)+ 单飞换 token + Redis 缓存- 其余业务接口 → 手动 HttpUtils 透传至源服务器
http://10.10.10.228:29999 - token 失效三重自愈:10秒主动探活 + 预过期刷新 + 业务接口 401 被动兜底
技术栈
| 组件 | 选择 |
|---|---|
| 框架内核 | Solon Cloud Gateway(提供 Vert.x HTTP Server + Solon 内核) |
| 透传 | 本地通配 Controller(@Mapping("/**"))+ HttpUtils 手动透传 |
| HTTP 客户端 | solon-net-httputils(HttpUtils.http(url).exec(method)) |
| Redis | redisx(基于 Jedis,复用源服务器 228:6379 db11) |
| 定时任务 | solon-scheduling-simple(@Scheduled + @EnableScheduling) |
| JSON | Solon 内置 snack4(org.noear.snack4.ONode,不使用 fastjson,规避其 0day 漏洞) |
关键约定(开发必须遵守)
1. 文件路径
- 所有文件操作必须用完整绝对 Windows 路径(如
E:\yixiongspace\dc-solon-gateway\src\...)
2. 代码注释
- 所有注释用简体中文(类/方法/行内注释)
- 标识符(类名/方法名/变量名)用英文
3. Solon 注意事项(踩过的坑,务必牢记)
- 不要用
solon.cloud.gateway.routes路由透传:其Path=/**会覆盖本地 Controller,使 watchUserLogin 无法本地处理。本项目用本地通配 Controller 手动透传。 - 定时任务用
@Scheduled(非@Async),启动类加@EnableScheduling,注解包org.noear.solon.scheduling.simple.annotation.Scheduled。 - Redis 用 redisx(非 solon-redis-jedis),API 为会话式
getBucket().store/get+open(session -> session.key(k).delete())。 - HTTP 响应状态码用
response.code()(非.status()),JSON body 用bodyOfJson()。
4. RSA 加密
- 中转的
RsaEncryptUtil必须与源服务器RSAEncryptUtils对齐:Cipher.getInstance("RSA")=RSA/ECB/PKCS1Padding,公钥 X.509、私钥 PKCS#8、明文 UTF-8、密文 Base64。 - 源服务器代码位置:
E:\giteaspace\data-center-boot-spring3\jeecg-boot-base-core\...\RSAEncryptUtils.java
5. 单飞机制
- 中转为单实例,单飞用本地
synchronized双检锁(无需 Redis 分布式锁)。 - 探活失效/被动401 后必须先清缓存再换 token(
forceRefresh),否则命中旧缓存返回失效 token 死循环。
配置
配置采用 .env + 占位符 机制(类似 dotenv):
.env(项目根目录,不入库):存储真实敏感值(密码、私钥、Redis、源服务器地址),格式KEY=VALUE.env.example(入库):模板,复制为.env后填真实值app.yml(注意:Solon 默认读app.yml,非application.yml):用${KEY}占位符引用 .env 变量EnvLoader:Solon.start前调用,读取.env→System.setProperty注入系统属性,使 yml 占位符解析GatewayConfig/RedisConfig:双保险读取(先 Solon.cfg,取不到则 fallbackSystem.getProperty)
.env 不入 git(见
.gitignore)。修改敏感配置只改.env,不改 yml。 运行:java -jar dc-solon-gateway.jar(从项目根/jar同目录启动,确保能读到.env)。
相关文档
- 方案设计与开发进度:
E:\data\ob_data\myob\11 健康长庆\数据中心转发网关优化\数据中心转发网关优化.md - 项目记忆:
.claude/memory/(索引见.claude/memory/MEMORY.md)
待联调验证(测试环境)
以下 API 细节在编码时基于文档/训练数据,需真实环境验证:本地路由优先级、redisx 注入与删除方法、Solon Context API、@Body 注解、redisx 版本兼容性。详见 OB 文档「开发记录」章节。