sse心跳保活需用:keepalive注释行,浏览器忽略内容但重置超时;nginx须设proxy_read_timeout≥65且proxy_buffering off;跨域时服务端必须返回精确access-control-allow-origin和access-control-allow-credentials: true;前端仅需在readystate===0或error时重连。

SSE 服务端下发的心跳保活信号,浏览器本身不触发事件,但会重置内部连接存活计时器。关键不是“处理”心跳内容,而是确保它被正确发送、传输并被浏览器识别为有效保活行为。
服务端必须用 :keepalive 注释格式
心跳不能是 data:、event: 或空行,必须是以英文冒号开头的注释行:
:keepalive
浏览器会忽略整行内容,但明确将其视为连接活跃信号,重置超时倒计时。其他形式(如 data: "" 或纯换行)在 Safari、Firefox 等浏览器中无效,无法阻止静默断连。
Nginx 和后端框架要配合不拦截、不缓冲
若使用 Nginx 反向代理,需显式延长读取超时,并禁用响应缓冲:
- 设置 proxy_read_timeout ≥ 65(建议 65–90),确保大于服务端心跳间隔(推荐 25–30 秒)
- 添加 proxy_buffering off,防止心跳被缓存在 Nginx 内部
- 后端框架(如 Express/Flask/Spring Boot)需禁用响应体压缩与缓冲,例如 Express 中调用
res.removeHeader('Content-Encoding')并设置res.socket.setNoDelay(true)
跨域场景下心跳必须携带凭证上下文
前端启用 withCredentials: true 时,服务端每次响应(包括心跳行)都必须返回合法跨域头:
-
Access-Control-Allow-Origin 不能为
*,必须是具体协议+域名(如https://your-app.com) - Access-Control-Allow-Credentials: true 必须存在且为真值
- 缺少任一,后续心跳请求可能丢失 Cookie,导致会话失效
前端无需监听或解析心跳,但要正确重连
EventSource 不提供心跳事件回调。前端只需关注连接状态:
- 当
eventSource.readyState === 0(即 CLOSED)时,说明连接已终止,应手动重建 - 当收到非 200 响应(如 503)时,EventSource 会停止自动重试,此时也需捕获 error 事件并主动恢复
- 避免在 readyState === 1(OPEN)时盲目重连——那是无效操作,还可能引发竞态
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











