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

发布日期:2026-08-15

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

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

标准代理地址格式

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

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

 

二、三种主流 Java 接入方式

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

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());
        }
    }
}

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

 方式 2Java 原生 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();
    }
}

方式 3Spring 项目 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 稳定。

 

四、常见报错与解决方案

1407 Proxy Authentication Required

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

2、连接超时 ConnectException

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

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

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

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常见问题

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

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

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

3D城市图标

巨量IP VIP测试免费开通

覆盖全国200+城市地区线路,日活跃IP超200万个,注册免费送1000IP

立即领取
巨量IP公众号二维码

关注巨量HTTP公众号

巨量IP代理logo

Copyright © 版权所有 湖北巨量云科技有限公司

本模板版权局已登记·盗版必究,登记号:黔作登字-2021-F-00331209

GitHub图标 QQ图标 微信图标
免责声明 巨量IP倡导绿色合规经营,保障服务绿色、便捷、合法一直是我们的初衷,为积极响应落实《中华人民共和国网络安全法》,巨量IP要求所有用户必须实名认证,用户行为日志保存完整,并严格依据《巨量IP服务协议》对用户行为进行规范管理;用户使用巨量IP从事的任何行为均不代表巨量IP的意志和观点,与巨量IP的立场无关。严禁用户使用巨量IP从事任何违法犯罪行为, 产生的相关责任用户自负,对此巨量IP不承担任何法律责任。