token 过期后连接一直重试,Console 只打印 WebSocket connection to wss://... failed,onclose 的 code 是 1006 reason 为空,试了 20 次也没提示重新登录。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,浏览器出于安全不给脚本暴露握手阶段的 HTTP 状态码,任何非 101 的响应都归到 1006,响应体也读不到。服务端回的 401 只留在 Network 面板里,业务代码拿不着。

「1006 握手失败」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" \
  -H "Sec-WebSocket-Version: 13" \
  "https://example.com/ws?token=expired"

权限不要一口气开到最大,先加到够用再往上试,范围小才好收。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

具体做法是,握手前先调普通接口校验 token 过期就跳登录;服务端把失败原因塞进 URL 参数或子协议 让客户端能读到;客户端对 1006 做次数限制 三次就停别一直刷;用 curl 手打一次握手 看真实状态码。

最后用这个标准收尾,token 过期时前端弹登录框 Network 面板里能看到 401 不再无限重连。

作者 9823189