配置 Jetty WebSocket 客户端使用代理

Configuring Jetty WebSocket Client to use proxy

我还没有找到任何解决方案。 Jetty 好像还不支持这个功能。可能我说的不对,请赐教。

我有一个非常简单的 Java 客户端,它连接到位于 localhost:8080Java 服务器。我想在它们之间添加一个透明代理,以模拟我们可以在公司的专用网络中找到什么。

更新:2017 年 5 月

从 Jetty 9.4.0 及更高版本开始,本机 Jetty WebSocketClient 通过 Jetty HttpClient 支持代理。

这通过声明一个 HttpClient 及其代理配置,然后将其交给 the WebSocketClient constructor 使用来实现。

这仅适用于以下情况:

  • HTTP/1.1 升级到 WebSocket
  • 本机 Jetty WebSocket APIs

不适用于以下情况:

  • HTTP/2(目前还没有关于 HTTP/2 的 WebSocket 规范)
  • JSR356 javax.websocket(有关于 API 对 JSR356 ClientContainer 进行重大更改以允许通过构造函数传入 Jetty HttpClient 的想法,请通过 filing a new issue on github 这么说)

原答案

Jetty 9 不支持 Jetty Native WebSocket 客户端或 JSR-356 (javax.websocket) 客户端实现。

此支持计划用于 Jetty 10(正在跟踪 Servlet 4),并且将导致 Jetty 中的整个客户端库套件的完全重新设计,以获得对 :

的同等支持
  • HTTP/1.1
  • HTTP/2 (native/direct)
  • HTTP/1.1 升级到 HTTP/2 (h2c)
  • HTTP/1.1 升级到 WebSocket
  • HTTP/2 websocket 频道(目前在草案规范中)
  • 代理支持
  • Cookie 支持
  • 等...

由于 JSR-356 支持要求,Jetty 上现有的 WebSocket 客户端实现是独立的。

现有的 WebSocket 客户端不利用 Jetty 9.x 中现有的 Jetty HttpClient。如果确实如此,那么代理支持可能会在一组非常有限的场景下起作用。

这是一个低优先级的功能请求,因为目前支持 WebSocket 的现有代理很少(实际上,它们对 HTTP/1.1 升级的支持普遍不佳)。甚至 Jetty 自己的 Server side Proxy 目前也不支持 HTTP/1.1 升级连接。

根据 How HTML5 Web Sockets Interact With Proxy Servers 中的图 2,如果您尝试使用 transparent 代理,您不需要必须在客户端要求代理支持。另一方面,explicit 代理需要客户端库支持代理。

如果您的代理是透明的,Jetty WebSocket 客户端不会有任何问题。