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: 13Sec-WebSocket-Key: MoTfrW6Iim1noQgYHlkeYQ==Upgrade: websocketCookie: jwt=eyJhbGciO....Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bitsHost: blabla.com.trECID-Context: 1.005jsZwLhO_EoIWVLynJ8A0001Cy0000i2;kXjEConnection: Keep-AliveX-WebLogic-KeepAliveSecs: 30X-WebLogic-Force-JVMID: -414283189X-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内置握手处理器的头校验逻辑,直接判定请求非法终止握手。
可落地解决方案
- 自定义适配Spring握手校验逻辑
继承Spring提供的DefaultHandshakeHandler类,重写validateUpgrade方法,兼容Weblogic转发场景下的Connection: Keep-Alive头值:保留对Upgrade: websocket头的强校验,放宽对Connection头值的匹配规则,避免因头值被Weblogic改写导致校验不通过。 - 调整Weblogic转发规则
登录Weblogic控制台,进入对应安全域的网络通道配置,关闭对WebSocket请求的Connection头强制改写逻辑;如果项目走Weblogic集群代理路由,需配置路由规则在转发WebSocket请求时,保留客户端原始的Connection、Upgrade头值不被代理层覆盖。 - 在握手拦截器层做头值修正
自定义WebSocket握手拦截器,在请求进入握手校验流程前做头值预判:如果检测到请求携带Upgrade: websocket头(即握手请求),且Connection头值为Keep-Alive,临时将头值修正为Upgrade后再传递给后续校验流程,不改变原有业务逻辑。
内容的提问来源于stack exchange,提问作者develuper
相关产品推荐
相关产品推荐

