嵌入式 Jetty - 将 WebSocketUpgradeFilter 与 AsyncProxyServlet

时间:2021-02-12 13:32:21

标签: jetty embedded-jetty jetty-9

我有一个扩展 AsyncProxyServlet 的类来使用 Jetty 进行代理:

Server httpProxy = new Server();
ServletHolder servletHolder = new ServletHolder(TunnelProxyServlet.class);
HandlerCollection handlers = new HandlerCollection();
httpProxy.setHandler(handlers);

ServletContextHandler contextHandler = new ServletContextHandler(handlers, "/", ServletContextHandler.SESSIONS);
        
contextHandler.addServlet(servletHolder, "/*");

现在我想为此添加 WebSocket 支持。

我试过了:

try {
    WebSocketUpgradeFilter.configure(contextHandler);
    NativeWebSocketServletContainerInitializer.configure(contextHandler, ((context, container) ->
    {
      container.addMapping("/*", (req, resp) -> new WebSocketProxy().getWebSocketConnectionListener());
    }));
   } catch (ServletException ex) {
     Logger.getLogger(HttpProxy.class.getName()).log(Level.SEVERE, ex.getMessage());
   }

但代码永远不会达到这一点。

如何使用 WebSocket 进行代理?

1 个答案:

答案 0 :(得分:0)

WebSocket 代理是一个非常庞大而复杂的话题。

首先,让我先说从 Jetty 10 开始 WebSocket 代理是可能的。

https://github.com/eclipse/jetty.project/pull/3365

中为 Jetty 10 添加了对 WebSocket 代理的基本支持

遗憾的是,Jetty 9 不支持 WebSocket 代理。 要么内置于 Jetty 本身,要么在 Jetty 的 WebSocket 层中具有足够的核心功能,以允许您自己实现它。

接下来,Jetty 的 AsyncProxyServlet 无法处理升级的连接(如 WebSocket)。该类只能处理 HTTP 请求(无论是 HTTP/1.0、HTTP/1.1 还是 HTTP/2。在不久的将来支持 HTTP/3)。

一些建议,当您进行 WebSocket 代理时,您需要决定如何去做。

您要按原样代理帧吗? (最简单也是最推荐的方法)。

您要阅读框架内容吗? (需要复杂的扩展操作、扩展保存、帧保存,以及从帧级别读取部分消息的能力等)

您是否要阅读整个消息(1..n 帧)内容? (这使您对 websocket 的内存要求增加了四倍:远程 websocket 客户端 -> websocket 代理服务器 -> 对消息感兴趣的代理 -> websocket 代理客户端 -> websocket 后端服务器)

相关问题