You need to enable JavaScript to run this app. Weblogic 12c部署Spring MVC 5.1.0 WebSocket因Keep-Alive头握手失败
优惠活动
大模型
产品
解决方案
定价
更多

Weblogic 12c部署Spring MVC 5.1.0 WebSocket因Keep-Alive头握手失败

Weblogic环境下WebSocket握手失败问题排查与解决

问题现象

  • 项目基于Weblogic 12c + Spring MVC 5.1.0.RELEASE开发
  • 本地Tomcat环境运行完全正常,部署到Weblogic后,仅在使用安全域名HTTPS访问时触发WebSocket握手失败,直接通过IP+HTTP地址访问时功能无异常
  • 客户端测试使用的命令为:wscat -c ws://localhost:8080/projectName/echo --no-color

服务端报错日志

Apr 09, 2021 2:28:57 PM org.springframework.web.socket.server.support.AbstractHandshakeHandler handleInvalidConnectHeader
SEVERE: Handshake failed due to invalid Connection header [Keep-Alive]
<Apr 9, 2021 2:28:57 PM GMT+03:00> <Error> <org.springframework.web.socket.server.support.DefaultHandshakeHandler> <BEA-000000> <Handshake failed due to invalid Connection header [Keep-Alive]>

握手阶段服务端收到的请求头

  • Sec-WebSocket-Version: 13
  • Sec-WebSocket-Key: MoTfrW6Iim1noQgYHlkeYQ==
  • Upgrade: websocket
  • Cookie: jwt=eyJhbGciO....
  • Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
  • Host: blabla.com.tr
  • ECID-Context: 1.005jsZwLhO_EoIWVLynJ8A0001Cy0000i2;kXjE
  • Connection: Keep-Alive
  • X-WebLogic-KeepAliveSecs: 30
  • X-WebLogic-Force-JVMID: -414283189
  • X-WebLogic-Request-ClusterInfo: true

现有项目WebSocket配置

@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
   registry.addHandler(new EchoHandler(), "/echo").addInterceptors(customHandshakeInterceptor())
                .setAllowedOrigins("*");
}

问题根因

按照WebSocket RFC 6455规范,合法的WebSocket握手请求要求Connection头值为Upgrade。Weblogic在安全域名HTTPS的网络通道、集群代理转发场景下,会自动覆盖WebSocket握手请求的Connection头为Keep-Alive,触发Spring MVC内置握手处理器的头校验逻辑,直接判定请求非法终止握手。

可落地解决方案

  1. 自定义适配Spring握手校验逻辑
    继承Spring提供的DefaultHandshakeHandler类,重写validateUpgrade方法,兼容Weblogic转发场景下的Connection: Keep-Alive头值:保留对Upgrade: websocket头的强校验,放宽对Connection头值的匹配规则,避免因头值被Weblogic改写导致校验不通过。
  2. 调整Weblogic转发规则
    登录Weblogic控制台,进入对应安全域的网络通道配置,关闭对WebSocket请求的Connection头强制改写逻辑;如果项目走Weblogic集群代理路由,需配置路由规则在转发WebSocket请求时,保留客户端原始的Connection、Upgrade头值不被代理层覆盖。
  3. 在握手拦截器层做头值修正
    自定义WebSocket握手拦截器,在请求进入握手校验流程前做头值预判:如果检测到请求携带Upgrade: websocket头(即握手请求),且Connection头值为Keep-Alive,临时将头值修正为Upgrade后再传递给后续校验流程,不改变原有业务逻辑。

内容的提问来源于stack exchange,提问作者develuper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 12:45:03