全栈交付:契约、认证、上传下载、WebSocket 与 Nginx
前端发出请求、后端返回成功,用户却没拿到文件或没有保持登录,问题常在两端约定或代理配置上。下面沿着认证、上传下载和实时连接分别检查,让整条用户操作都能完成。
完整产品链路需要前后端对齐 API、身份、代理、文件和实时连接,并能以 HTTPS 和自动化部署交付。
1. 本文覆盖范围
- OpenAPI 与错误模型
- Cookie/BFF 与 token
- 文件导入导出
- WebSocket/SSE、Nginx 与 HTTPS
2. 核心知识详解
1. 契约协作
OpenAPI 定义输入、响应、错误和安全方案,生成客户端类型但仍保留运行时校验和兼容测试。
- 分页、时间、金额、枚举和空值语义统一。
- 错误含稳定 code、message、fieldErrors 和 requestId。
- 版本演进添加优先,弃用有观测和期限。
这里容易混淆的是: 只共享 Java DTO 源码会把内部模型和外部契约耦合,且不能替代 HTTP 语义。
2. 浏览器认证
同站 Web 应用可使用 HttpOnly Secure SameSite cookie/BFF;跨域资源服务器使用 OAuth token。CSRF、CORS 和 XSS 分别处理。
- 代理后正确配置 trusted proxy 和外部 scheme。
- cookie domain/path 最小化。
- 登出撤销服务端会话/refresh token。
这里容易混淆的是: 把长期 token 放 localStorage 会扩大 XSS 窃取后果,应按架构评估更安全的 BFF/cookie。
3. 文件导入导出
上传采用 multipart/分片或对象存储直传,服务端校验大小、类型、权限和内容。大导出使用异步任务和临时签名下载。
- 导入结果按行给出成功、错误和幂等标识。
- 文件名使用 Content-Disposition RFC 兼容编码。
- 下载授权在生成和读取时都检查,URL 短期有效。
这里容易混淆的是: 把大文件完整读入 JVM 堆会造成内存峰值,使用流式、配额和背压。
4. 实时通信与代理
SSE 适合服务端单向事件,WebSocket 适合双向低延迟。Nginx/网关配置 Upgrade、超时、buffering、连接数和 TLS。
- 连接建立时认证,长连接期间处理权限变化和 token 过期。
- 消息有序号、心跳、重连和断线补偿。
- HTTPS 自动续期并启用现代 TLS 配置。
这里容易混淆的是: WebSocket 建连成功后连接可能随时中断,可靠业务仍需持久状态和重同步。
3. 工程链路
4. 教学示例(结合本章运行前提)
这里分别代理普通接口与 WebSocket 升级请求,backend 需要在 Nginx 配置中有对应定义。部署时还要确认超时、TLS 与后端对代理头的信任设置,不能只凭浏览器能连上就认为整条链路正确。
location /api/ {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /ws/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
5. 实践与验证
- 生成 OpenAPI TypeScript 客户端并写兼容测试。
- 实现流式导入、逐行错误报告和异步导出。
- 通过 Nginx 发布 HTTPS 与 WebSocket,验证重连和权限失效。
6. 掌握检查
- 能维护契约。
- 能选择浏览器认证。
- 能安全流式处理文件。
- 能运营实时连接和代理。