Java网络代理怎么设置
在 Java 中设置**网络代理(Proxy)**有多种方式,取决于你是做 HTTP 请求、Socket 连接,还是 全局代理。下面按常见场景给你一个完整说明。
一、通过 JVM 参数设置(全局代理,最常用 ✅)
适合所有基于 Java 的网络请求(HttpURLConnection、很多第三方库)。
1️⃣ HTTP / HTTPS 代理
java
-Dhttp.proxyHost=127.0.0.1
-Dhttp.proxyPort=7890
-Dhttps.proxyHost=127.0.0.1
-Dhttps.proxyPort=7890
-jar app.jar
2️⃣ 排除某些地址不走代理
-Dhttp.nonProxyHosts="localhost|127.0.0.1|*.example.com"
注意:
nonProxyHosts用|分隔,不是逗号
二、代码中设置系统代理(程序级)
System.setProperty("http.proxyHost", "127.0.0.1");
System.setProperty("http.proxyPort", "7890");
System.setProperty("https.proxyHost", "127.0.0.1");
System.setProperty("https.proxyPort", "7890");
System.setProperty("http.nonProxyHosts", "localhost|127.0.0.1");
⚠️ 必须在 网络请求之前设置
三、使用 Proxy 类(精细控制 ✅)
适合你只想让某一次请求走代理。
1️⃣ HTTP 请求示例
import java.net.*;
public class ProxyTest {
public static void main(String[] args) throws Exception {
Proxy proxy = new Proxy(Proxy.Type.HTTP,
new InetSocketAddress("127.0.0.1", 7890));
URL url = new URL("https://www.google.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection(proxy);
conn.setRequestMethod("GET");
int code = conn.getResponseCode();
System.out.println(code);
}
}
四、Java 11+ HttpClient 设置代理 ✅(推荐)
import java.net.*;
import java.net.http.*;
public class HttpClientProxy {
public static void main(String[] args) throws Exception {
ProxySelector selector = ProxySelector.of(
new InetSocketAddress("127.0.0.1", 7890)
);
HttpClient client = HttpClient.newBuilder()
.proxy(selector)
.build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://www.google.com"))
.build();
client.send(request, HttpResponse.BodyHandlers.discarding());
}
}
五、SOCKS 代理(Socket / SSH 代理)
JVM 参数方式
-DsocksProxyHost=127.0.0.1
-DsocksProxyPort=1080
代码方式
Proxy proxy = new Proxy(Proxy.Type.SOCKS,
new InetSocketAddress("127.0.0.1", 1080));
✅ SOCKS 代理对 TCP 层生效(Socket、HTTP 都可用)
六、第三方库代理设置
Apache HttpClient 5
HttpHost proxy = new HttpHost("127.0.0.1", 7890);
RequestConfig config = RequestConfig.custom()
.setProxy(proxy)
.build();
OkHttp
Proxy proxy = new Proxy(Proxy.Type.HTTP,
new InetSocketAddress("127.0.0.1", 7890));
OkHttpClient client = new OkHttpClient.Builder()
.proxy(proxy)
.build();
七、常见坑 ⚠️
| 问题 | 说明 |
|---|---|
| HTTPS 不走 http.proxy | HTTPS 必须单独设置 |
| 代理不生效 | 顺序问题,必须在请求前 |
| Docker / K8s 环境 | 可能需要 host.docker.internal |
| 认证代理 | 需用 Authenticator.setDefault() |
八、需要代理认证(用户名密码)
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("user", "password".toCharArray());
}
});
总结(推荐方案)
| 场景 | 推荐方式 |
|---|---|
| 全局代理 | JVM 参数 ✅ |
| 单个请求 | Proxy 类 |
| 新项目 | Java 11+ HttpClient |
| SOCKS | Proxy.Type.SOCKS |
如果你愿意,可以告诉我:
- ✅ Java 版本
- ✅ HTTP / HTTPS / SOCKS
- ✅ 是否用 Spring / OkHttp / Apache HttpClient
我可以给你完全贴合你项目的配置示例。