Files
dc-solon-gateway/CLAUDE.md
T
lianlonggangandClaude a7937b76d6 feat: 新增全局CORS跨域过滤器,支持设备后台跨域访问网关
- 新增 CorsFilter(@Component(index=-200)最高优先级)
- OPTIONS预检请求:动态回显 Access-Control-Request-Headers,直接短路返回200不透传源服务器
- 其他请求:响应头补充 Access-Control-Allow-Origin 等CORS头
- 解决jeecg vue3前端自定义头(x-version等)被CORS拦截问题

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-05 18:23:13 +08:00

74 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 被动兜底
- **全局 CORS**CorsFilter 处理跨域(设备后台跨域访问网关),OPTIONS 预检直接短路返回
## 技术栈
| 组件 | 选择 |
|------|------|
| 框架内核 | 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,取不到则 fallback `System.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 文档「开发记录」章节。