50ad577b29
- 根因:浏览器对**同源**的 POST/PUT/DELETE 也会带 Origin,而 Spring MVC 只看 "请求里有没有 Origin"(Spring 7.0.9 的 DefaultCorsProcessor 没有同源短路), 带了又不在白名单里 → 进 Controller 之前直接 403 - WebConfig 的白名单写死为 localhost/内网;注释声称"生产配置见 application-prod.yml 的 fill.cors.allowed-origins",但该属性根本不存在、也没人读它 —— 于是"前后端同源部署"的登录/上传/提交必然登不上(生产 2026-10-20 事故) - 改为配置驱动:FillProperties.Cors + fill.cors.allowed-origins (可用 XT_CORS_ALLOWED_ORIGINS 覆盖);prod 默认 shenxue.jxit.com / admin.shenxue.jxit.com / *.shenxue.jxit.com; dev 补上花生壳穿透域名(H5 走穿透时 POST 同样会被拦) - 启动日志打印生效白名单,排障先看那一行 - 新增 CorsWhitelistTest(3 条):生产 yml 真能绑定、通配符匹配租户子域、陌生源仍被拒 - docs/09 §2.4:本站地址必须在白名单 + 反代必须传 Host/X-Real-IP/X-Forwarded-For/X-Forwarded-Proto(缺了登录日志 IP 全是 127.0.0.1); 交接摘要 §一·四十四 记录事故,并写清"1700+ 条 e2e 全绿为什么还是漏了" 为什么 e2e 没抓到:脚本是 Python requests,不带 Origin 头,永远走不到 CORS 分支; 本地浏览器用的 localhost 正好命中写死的 dev 白名单。唯一能暴露它的是"浏览器 + 正式域名"。 验证:生产白名单下 admin / 主域名 / t1 / t12 → 200,evil / 后缀拼接 / http → 403; 真实 RSA 登录 + Origin: https://admin.shenxue.jxit.com → 200、code=0、拿到 token; mvn test 15/15;verify-all --quick 6/6;check-test-profile 通过。 接口、库表、契约均无变化。