Tomcat WebSocket BufferOverflowException

3
我有一个微服务应用程序,其中需要使用WebSockets实现一个功能。浏览器连接到API网关,然后需要将WebSocket请求转发到适当的微服务。为了实现这一点,在API网关中使用了Spring的StandardWebSocketClient。API网关充当WebSocket请求的代理。
我的应用程序使用OAuth进行身份验证,因此当在API网关中代理WebSocket请求时,我需要传递OAuth2令牌。当StandardWebSocketClient使用Tomcat发出CONNECT请求时,我会收到BufferOverflowException,因为Bearer令牌似乎不适合Tomcat使用的缓冲区。
通过查看Tomcat源代码,缓冲区大小似乎被限制为4096字节。请参见:https://github.com/apache/tomcat/blob/8fd5d6273099c504e1739080c07cf4d33cff89bf/java/org/apache/tomcat/websocket/WsWebSocketContainer.java#L717 是否有一种解决方法来克服这个限制呢?

你可能会找到一些配置,比如这个(https://dev59.com/fnA85IYBdhLWcg3wF_cO#10848475),可以增加缓冲区大小。再多搜索一下,我相信你会找到好的配置。此外,你可能需要在websocket服务器配置代码中增加消息缓冲区大小。 - Sepehr GH
2个回答

0

由于授权标头中的大令牌,也看到了这一点。使用Tomcat 8.5.x

用于构建HTTP请求的缓冲区硬编码为4096字节。我没有看到任何解决方法 - 我认为Tomcat需要更新一个更大或可配置的缓冲区以进行连接升级请求。

我已经向Tomcat提交了一个错误报告 - https://bz.apache.org/bugzilla/show_bug.cgi?id=62596 - 希望很快得到解决。


0
如果您可以控制您的WebSocket服务器程序,您可以在onOpen()方法中为每个来自WebSocket客户端的新连接设置缓冲区大小。
@ServerEndpoint("/endpoint1")
public class Server {

    @OnOpen
    public void onOpen(Session session) {
        System.out.println("onOpen::" + session.getId());
        // eg:
        session.setMaxBinaryMessageBufferSize(4 * 1024 * 1024);
        session.setMaxTextMessageBufferSize(5 * 1024 * 1024);

    }

    @OnClose
    public void onClose(Session session) {
        System.out.println("onClose::" + session.getId());
    }

    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println(session.getId() + " message=" + message);
    }
}

但是如果您设置缓冲区大小> 4m,可能会收到有关内存泄漏的警告。 在Tomcat8中进行了测试。

  • {{link1:javax.websocket接口会话}}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接