Java 带SSL的Jetty HTTP客户端

Java 带SSL的Jetty HTTP客户端,java,https,Java,Https,我正在遵循,但无法使SSL连接正常工作。当我使用代理连接时,它抛出一个“未实现”异常。当我不使用代理时,它不会返回任何内容 HttpClient client = new HttpClient(); client.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL); client.setProxy(new Address("www.example.com", 80)); client.start(); // create the exch

我正在遵循,但无法使SSL连接正常工作。当我使用代理连接时,它抛出一个“未实现”异常。当我不使用代理时,它不会返回任何内容

HttpClient client = new HttpClient(); client.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL); client.setProxy(new Address("www.example.com", 80)); client.start(); // create the exchange object, which lets you define where you want to go // and what you want to do once you get a response ContentExchange exchange = new ContentExchange() { // define the callback method to process the response when you get it // back protected void onResponseComplete() throws IOException { super.onResponseComplete(); String responseContent = this.getResponseContent(); // do something with the response content System.out.println(responseContent); } }; exchange.setMethod("GET"); exchange.setURL("https://www.example.com"); exchange.setScheme(HttpSchemes.HTTPS_BUFFER); // start the exchange client.send(exchange); exchange.waitForDone(); System.err.println("Response status: " + exchange.getResponseStatus()); HttpClient=新的HttpClient(); 客户端.setConnectorType(HttpClient.CONNECTOR\u选择\u通道); setProxy(新地址(“www.example.com”,80)); client.start(); //创建exchange对象,该对象允许您定义要转到的位置 //一旦得到回应,你想做什么 ContentExchange=新ContentExchange() { //定义回调方法,以便在收到响应时对其进行处理 //背 受保护的void onResponseComplete()引发IOException { super.onResponseComplete(); 字符串responseContent=this.getResponseContent(); //对响应内容做些什么 System.out.println(responseContent); } }; exchange.setMethod(“GET”); exchange.setURL(“https://www.example.com"); setScheme(HttpSchemes.HTTPS_缓冲区); //开始交换 客户端。发送(交换); exchange.waitForDone(); System.err.println(“响应状态:+exchange.getResponseStatus());
是的,Jetty客户端SelectConnector的源代码如下所示:

 if (dest.isProxied()) {
    String connect = HttpMethods.CONNECT+" "+dest.getAddress()+HttpVersions.HTTP_1_0+"\r\n\r\n";
    // TODO need to send this over channel unencrypted and setup endpoint to ignore the 200 OK response.    
    throw new IllegalStateException("Not Implemented");
 }
因此,该功能目前还不存在——至少在我使用的版本(6.1.16)中是这样使用代理的。在milestone Jetty 7版本中也是如此(我在下载源代码后发现)

我建议您尝试不同的客户端-请查看Apache HttpClient:


Jetty开发人员应该在Javadocs中清楚地标记这一点。另一种选择是为他们实现该功能并将其作为补丁提交回去。

是的,Jetty客户端SelectConnector的源代码如下所示:

 if (dest.isProxied()) {
    String connect = HttpMethods.CONNECT+" "+dest.getAddress()+HttpVersions.HTTP_1_0+"\r\n\r\n";
    // TODO need to send this over channel unencrypted and setup endpoint to ignore the 200 OK response.    
    throw new IllegalStateException("Not Implemented");
 }
因此,该功能目前还不存在——至少在我使用的版本(6.1.16)中是这样使用代理的。在milestone Jetty 7版本中也是如此(我在下载源代码后发现)

我建议您尝试不同的客户端-请查看Apache HttpClient:

Jetty开发人员应该在Javadocs中清楚地标记这一点。另一种选择是为他们实现该功能,并将其作为补丁提交回来。

尝试ProxyHandler(jetty 7),它处理隧道https连接的connect命令(通过代理)

尝试ProxyHandler(jetty 7),它处理隧道https连接的connect命令(通过代理)码头v7.4.1:

if (dest.isSecure()) {
    if (dest.isProxied()) {
        SSLEngine engine=newSslEngine(channel); ep = new ProxySelectChannelEndPoint(channel, selectSet, key, _sslBuffers, engine, (int)_httpClient.getIdleTimeout());
    } else { ...
码头v7.4.1:

if (dest.isSecure()) {
    if (dest.isProxied()) {
        SSLEngine engine=newSslEngine(channel); ep = new ProxySelectChannelEndPoint(channel, selectSet, key, _sslBuffers, engine, (int)_httpClient.getIdleTimeout());
    } else { ...

您正在使用哪个版本的jetty客户端?您正在使用哪个版本的jetty客户端?