WebSocket 握手期间出错: 'Sec-WebSocket-Accept' header 值不正确

Error during WebSocket handshake: Incorrect 'Sec-WebSocket-Accept' header value

我有一个位于 spring-security-kerberos 后面的 spring-boot websocket 连接来实现 SSO。这按预期工作,但如果我重新启动服务器,我会看到客户端无法 re-connect 并出现错误 Error during WebSocket handshake: Incorrect 'Sec-WebSocket-Accept' header value.

我正在使用 @stomp/stompjs 4.0.8 并设置 stompClient.reconnect_delay = 5000

有什么办法可以解决吗?我担心 运行 这在负载平衡器后面会导致此错误一直发生。

这是基于the messaging-stomp-websocket example + spring-security websocket-authentication

似乎 spring-security-web RequestCacheAwareFilter 提取了缓存的请求,导致实际的 Sec-WebSocket-Key header 值被替换有一个无效的。

事件的顺序是每次客户端尝试 re-connect 客户端发出两个 websocket 请求,第一个被 WWW-Authenticate 拒绝:协商 header 而第二个包含 Authorization header 具有不同的 Sec-WebSocket-Key 值。

我能够通过完全禁用缓存来解决这个问题,例如WebSecurityConfigurerAdapter

@Override
protected void configure(final HttpSecurity http) throws Exception {
    http.requestCache().requestCache(new NullRequestCache())
}