websocket连接无法动态更新token,需提前重连:客户端解析exp定时关闭旧连接并用新token建连;服务端配合校验、返回过期提醒;消息需暂存重发,订阅重做,token禁放url而应走header或专用短期token。

WebSocket 本身不支持在连接建立后动态更新认证凭证(比如 Token),所以 Token 过期后无法“刷新”已建立的连接。正确做法是:提前感知过期、主动关闭旧连接、用新 Token 建立新连接。
Token 过期前主动重连
不要等断开才处理,而是在 Token 即将过期时(比如提前 30 秒)触发重连流程:
- 前端维护 Token 的过期时间(如从登录响应中解析
exp字段) - 启动定时器,在
exp - 30s时刻调用ws.close() - 关闭后立即调用
createWebSocket(newToken)建立新连接 - 确保重连逻辑幂等,避免重复创建或未清理旧实例
服务端配合校验与通知
光靠客户端计时不够可靠(时钟偏差、Token 被后台强制失效等),需服务端协同:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- WebSocket 握手时校验 Token,返回标准错误码(如
4001 Unauthorized) - 心跳响应中携带 Token 剩余有效期(如
{"expires_in": 120}) - 可选:服务端在 Token 将过期前主动推送提醒消息(如
{"type":"token_will_expire","in":60})
重连期间的消息暂存与恢复
重连不是瞬时的,要保障业务连续性:
- 发送消息前检查
ws.readyState === WebSocket.OPEN,否则加入待发队列 - 重连成功后,按顺序重发队列中的消息(注意幂等设计,服务端需支持去重)
- 订阅类操作(如 join room)需在新连接上重新执行,避免状态丢失
- 可记录最后收到的消息 ID,重连后请求「增量同步」补全断连期间数据
避免 Token 硬编码与泄露风险
Token 不应出现在 URL 或 WebSocket 构造函数中(易被日志/代理截获):
- 使用 HTTP Header 方式传递 Token:通过后端代理(如 Nginx)将鉴权头透传到 WebSocket Upgrade 请求
- 或采用短期有效的「WebSocket 专用 Token」:登录后额外请求一个 5 分钟有效期的 ws_token,专用于 ws 握手
- 禁止把 Token 拼在
ws://...?token=xxx中——URL 可能被浏览器历史、服务器 access_log 记录
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










