概述目标:在WebSocket连接建立与存续期间进行鉴权与心跳管理,避免空闲断开与令牌过期导致的中断。适用:实时推送、IM、通知系统。核心与实战握手鉴权(HTTP升级前):GET /ws HTTP/1.1

Sec-WebSocket-Key: ...

Authorization: Bearer eyJhbGciOi...

连接建立后消息协议:// 客户端->服务端定期发送心跳

{ "type": "ping", "ts": 1732617600000 }

// 服务端回复

{ "type": "pong", "ts": 1732617600000 }

// 令牌快过期时刷新

{ "type": "token_refresh", "token": "..." }

服务器示例(Node.js):const WebSocket = require('ws')

const wss = new WebSocket.Server({ port: 8080 })

function verifyToken(token) { /* 校验JWT与过期 */ }

wss.on('connection', (ws, req) => {

const auth = req.headers['authorization']

if (!auth || !verifyToken(auth.split(' ')[1])) { ws.close(4001, 'unauthorized'); return }

ws.isAlive = true

ws.on('message', (msg) => {

const data = JSON.parse(msg)

if (data.type === 'ping') { ws.send(JSON.stringify({ type: 'pong', ts: Date.now() })) }

if (data.type === 'token_refresh') { if (verifyToken(data.token)) ws.authToken = data.token; else ws.close(4001, 'unauthorized') }

})

ws.on('close', () => { /* 清理资源 */ })

})

setInterval(() => {

wss.clients.forEach((ws) => {

try { ws.ping() } catch {}

})

}, 30000)

示例断线重连与消息补偿:-- 客户端缓存未确认消息,重连后携带最后游标拉取补偿

服务端连接上限与分片:-- 通过连接分片与负载均衡扩展;记录连接ID与心跳状态

验证与监控连接与心跳:统计心跳丢失与断开原因;设置闲置超时与重试策略。安全性:验证令牌刷新与权限变化;在关闭时返回原因码。性能:观测消息队列与发送速率;避免大消息阻塞。常见误区仅握手鉴权忽视续期;长连接需支持令牌刷新。无心跳导致代理或服务端超时断开;需ping/pong与pong检查。重连未进行补偿导致消息丢失;需游标与补偿机制。结语通过握手鉴权、心跳保活与令牌刷新,WebSocket连接可在生产环境达到安全与高可靠,满足实时业务需求。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部