如何解决嵌入式 Jetty - 将 WebSocketUpgradeFilter 与 AsyncProxyServlet
我有一个扩展 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 进行代理?
解决方法
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 后端服务器)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。