Java和Squid代理主机名解析

3

我正在使用Squid代理进行FTP连接。在Squid代理上,我们有基于主机名的规则,问题是Java正在本地执行主机名解析,然后将原始IP传递给代理。

因此,以下是示例代码:

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 9999));
Socket socket = new Socket(proxy);
socket.connect(new InetSocketAddress("google.com", 21));
        

创建请求的方式如下:
CONNECT 172.217.23.142:21 HTTP/1.1
User-Agent: Java/14.0.1
Host: 172.217.23.142:21
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Proxy-Connection: keep-alive

所以,在CONNECT请求中,google.com已经被翻译成了172.217.23.142。有没有一种方法可以强制java.net.Proxy在与代理服务器建立通信时使用主机名?

我们使用的ftps连接的JSch库默认使用ProxyHTTP类进行此操作,我基本上需要与java.net.Proxy相同的功能。

1个回答

2
在Socket.connect中使用一个未解析的套接字地址:
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 9999));
Socket socket = new Socket(proxy);
socket.connect(InetSocketAddress.createUnresolved("google.com", 21));

connect 方法将使用已解析的 IP 地址。您可以在 HttpConnectSocketImpl 的实现 中看到这一点:

    final InetSocketAddress epoint = (InetSocketAddress)endpoint;
    String destHost = epoint.isUnresolved() ? epoint.getHostName()
                                            : epoint.getAddress().getHostAddress();
    final int destPort = epoint.getPort();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接