我还没有找到任何解决方案。似乎Jetty
还不支持这个功能。我可能错了,所以请给我开导。
我有一个非常简单的Java
客户端连接到localhost:8080
的Java
服务器。我想在它们之间添加一个透明代理,以模拟我们在公司私有网络中可以找到的内容。
更新:2017年5月,
从Jetty 9.4.0及以后开始,本机Jetty WebSocketClient通过Jetty HttpClient支持代理。
这是通过声明HttpClient及其代理配置,然后将其传递给WebSocketClient构造函数来使用的。
- HTTP/1.1升级到WebSocket
- 原生Jetty WebSocket api
不能与一起使用:
- HTTP/2(目前还没有HTTP/2的WebSocket规范)
- JSR356 javax。websocket(有一些想法对JSR356 ClientContainer进行API破坏更改,允许通过构造函数传入Jetty HttpClient,让我们知道这对你来说是否可行,请在github上提交一个新问题)
原始回答
在Jetty 9中,无论是Jetty Native WebSocket客户端还是JSR-356 (javax.websocket)客户端实现都不支持代理。
这项支持计划在Jetty 10(它正在跟踪Servlet 4)中进行,并且将导致Jetty中整个客户端库套件的完全重做,以获得对以下内容的同等支持:
- HTTP/1.1
- HTTP/2(本地/直接)
- HTTP/1.1升级到HTTP/2 (h2c)
- HTTP/1.1升级到WebSocket
- HTTP/2 websocket通道(目前在规范草案中) 代理支持
- <
- 饼干支持/gh>
- 等等…
由于JSR-356的支持要求,Jetty上现有的WebSocket客户端实现是独立的。
现有的WebSocket客户端在Jetty 9.x中不利用现有的Jetty HttpClient。如果确实如此,那么代理支持可能在非常有限的场景下起作用。
这是一个低优先级的特性请求,因为到目前为止,很少有现有的代理支持WebSocket(实际上,它们通常不支持HTTP/1.1升级)。即使Jetty自己的服务器端代理目前也不支持HTTP/1.1升级的连接。
根据HTML5 Web Sockets如何与代理服务器交互的图2,如果您试图使用透明代理,您不必在客户端要求代理支持。另一方面,显式代理要求客户端库支持代理。
如果你的代理是透明的,Jetty WebSocket客户端不会有任何问题。