登录 免费注册

Java程序接入HTTP代理完整实战教程

全文约 8460 字 · 预计阅读 22 分钟

本页目录

    Java程序接入HTTP代理完整实战教程

    一、巨量 IP HTTP 代理基础连接格式

    标准代理地址格式

    Plain Text
    http://代理账号:代理密码@隧道地址:端口

    代理认证方式:Basic Auth 身份验证,Java 代码中需要配置代理鉴权。

     

    二、三种主流 Java 接入方式

    方式 1:OkHttp(爬虫、采集项目最推荐)

    Maven 依赖

    xml

        com.squareup.okhttp3
        okhttp3
        4.12.0

    完整示例代码

    java
    import okhttp3.Authenticator;
    import okhttp3.OkHttpClient;
    import okhttp3.Request;
    import okhttp3.Response;

    import java.net.InetSocketAddress;
    import java.net.Proxy;

    public class OkHttpProxyDemo {
        public static void main(String[] args) throws Exception {
            // ========== 巨量IP隧道配置,自行替换 ==========
            String proxyHost = "隧道地址";
            int proxyPort = 端口号;
            String proxyUser = "代理账号";
            String proxyPwd = "代理密码";

            // 创建代理对象
            Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));

            // 代理身份认证
            Authenticator proxyAuthenticator = (route, response) -> {
                String credential = okhttp3.Credentials.basic(proxyUser, proxyPwd);
                return response.request().newBuilder()
                        .header("Proxy-Authorization", credential)
                        .build();
            };

            OkHttpClient client = new OkHttpClient.Builder()
                    .proxy(proxy)
                    .proxyAuthenticator(proxyAuthenticator)
                    .build();

            Request request = new Request.Builder()
                    .url("https://httpbin.org/ip") // 用于验证出口IP
                    .build();

            try (Response resp = client.newCall(request).execute()) {
                System.out.println(resp.body().string());
            }
        }
    }

    ✅适用场景:爬虫、高频采集、长连接任务,性能优秀。

     方式 2:Java 原生 HttpURLConnection(无需引入第三方包)

    java
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.Authenticator;
    import java.net.HttpURLConnection;
    import java.net.PasswordAuthentication;
    import java.net.Proxy;
    import java.net.InetSocketAddress;
    import java.net.URL;
    import java.util.Base64;

    public class NativeProxyDemo {
        public static void main(String[] args) throws Exception {
            String proxyHost = "隧道地址";
            int proxyPort = 端口号;
            String proxyUser = "代理账号";
            String proxyPwd = "代理密码";

            // 设置代理鉴权
            Authenticator.setDefault(new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(proxyUser, proxyPwd.toCharArray());
                }
            });

            Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));
            URL url = new URL("https://httpbin.org/ip");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection(proxy);

            // Basic认证头
            String auth = Base64.getEncoder().encodeToString((proxyUser + ":" + proxyPwd).getBytes());
            conn.setRequestProperty("Proxy-Authorization", "Basic " + auth);

            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
            br.close();
            conn.disconnect();
        }
    }

    方式 3:Spring 项目 RestTemplate 接入 HTTP 代理

    xml

        org.springframework.boot
        spring-boot-starter-web

    配置类

    java
    import org.springframework.context.annotation.Bean;
    import org.springframework

    .context.annotation.Configuration;
    import org.springframework.http.client.SimpleClientHttpRequestFactory;
    import org.springframework.web.client.RestTemplate;

    import java.net.Authenticator;
    import java.net.InetSocketAddress;
    import java.net.PasswordAuthentication;
    import java.net.Proxy;

    @Configuration
    public class ProxyConfig {

        private static final String PROXY_HOST = "隧道地址";
        private static final int PROXY_PORT = 端口号;
        private static final String PROXY_USER = "代理账号";
        private static final String PROXY_PWD = "代理密码";

        @Bean
        public RestTemplate restTemplate() {
            Authenticator.setDefault(new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(PROXY_USER, PROXY_PWD.toCharArray());
                }
            });

            Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(PROXY_HOST, PROXY_PORT));
            SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
            factory.setProxy(proxy);
            factory.setConnectTimeout(15000);
            factory.setReadTimeout(15000);
            return new RestTemplate(factory);
        }
    }

     

    三、短效隧道 / 长效隧道代码注意事项

    1. 短效隧道(每次请求更换 IP)
    每次请求建议关闭长连接:

    java
    request.header("Connection", "close");

    防止连接复用导致 IP 无法切换。

    2. 长效会话隧道(锁定 IP 一段时间)
    保留长连接,不需要添加 Connection:close,保证会话内 IP 稳定。

     

    四、常见报错与解决方案

    1、407 Proxy Authentication Required

    原因:代理账号密码错误 / 服务器公网 IP 没有添加巨量 IP 后台白名单。
    解决:
    ①核对账号密码,不要包含空格;
    ②登录巨量 IP 后台,把运行 Java 程序服务器公网 IP 加入白名单。

    2、连接超时 ConnectException

    ①隧道地址、端口填写错误;
    ②服务器出口网络无法访问代理节点;
    ③晚高峰线路拥堵,适当加大超时时间。

    3、IP 归属地和选择城市不一致

    属于少量地域漂移;下沉城市漂移概率高于省会;定向业务优先选择省会节点。

    4、大量 403 访问拦截

    代码层面优化:

    • 设置随机请求间隔;

    • 轮换 User-Agent;

    • 降低并发线程;

    • 多条隧道业务隔离。

     

    五、生产环境最佳实践(采集项目推荐)

    1. 优先使用 OkHttp,灵活性最高;

    2. 设置连接超时 10~15 秒,避免卡死;

    3. 区分短效、长效隧道配置 Connection 请求头;

    4. 大规模业务拆分多条隧道,不要共用一条隧道跑多个平台任务;

    5. 正式上线前 48 小时持续测试,覆盖晚高峰 20:00–23:00;

    6. 新用户先申请免费测试隧道调试代码。

     

    六、测试验证方法

    调用 https://httpbin.org/ip,打印返回的 IP 地址,确认出口 IP 为住宅 IP,代表代理对接成功。

     

    FAQ常见问题

    Q1:Java 代码可以同时接入多条巨量 IP 隧道吗?
    A:可以,构建多个独立 OkHttpClient 实例,分别配置不同隧道。

    Q2:HTTP 隧道代码能不能直接改成 SOCKS5?
    A:需要修改 Proxy.Type.SOCKS,配置方式略有区别。

    Q3:容器 Docker 内运行 Java 程序需要额外配置吗?
    A:需要填写宿主机 / 容器公网 IP 添加至巨量 IP 白名单,不要使用内网 IP。