Java 程序訪問外部網絡時常需通過代理服務器。支持 HTTP、HTTPS、FTP、SOCKS 多種協議。本文介紹兩種設置代理的方式:系統屬性全局生效、Proxy API 精確控制。
通過 System.setProperty() 設置 JVM 級網絡屬性,影響所有 HttpURLConnection、URL.openConnection() 等標準網絡調用。
Properties prop = System.getProperties();
// HTTP 代理
prop.setProperty("http.proxyHost", "183.45.78.31");
prop.setProperty("http.proxyPort", "8080");
prop.setProperty("http.nonProxyHosts", "localhost|192.168.0.*");
// HTTPS 代理
prop.setProperty("https.proxyHost", "183.45.78.31");
prop.setProperty("https.proxyPort", "443");
// FTP 代理
prop.setProperty("ftp.proxyHost", "183.45.78.31");
prop.setProperty("ftp.proxyPort", "21");
prop.setProperty("ftp.nonProxyHosts", "localhost|192.168.0.*");
// SOCKS 代理
prop.setProperty("socksProxyHost", "183.45.78.31");
prop.setProperty("socksProxyPort", "1080");
// 代理認證
Authenticator.setDefault(new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("userName", "Password".toCharArray());
}
});
特點:簡單、全局生效、無法針對單個連接單獨設置、需在程序啟動早期配置。
為單個連接指定代理,不影響其他連接。支持 HTTP、SOCKS 類型。
URL url = new URL("https://www.example.com");
InetSocketAddress addr = new InetSocketAddress("192.168.0.254", 8080);
Proxy proxy = new Proxy(Proxy.Type.HTTP, addr); // 或 Proxy.Type.SOCKS
Authenticator.setDefault(new Authenticator() { ... }); // 如需認證
HttpURLConnection conn = (HttpURLConnection) url.openConnection(proxy);
// 後續操作同普通連接
特點:粒度細、運行時動態決定、適合多代理場景、需手動處理認證。
| 維度 | 系統屬性 | Proxy API |
|---|---|---|
| 生效範圍 | 全局 (JVM 級) | 單連接 |
| 配置時機 | 啟動前/早期 | 運行時任意時刻 |
| 代碼侵入性 | 零侵入 (啟動參數 -D) | 需修改連接創建代碼 |
| 多代理支持 | 困難 | 原生支持 |
| 適用場景 | 統一出口代理、容器側車模式 | 爬蟲、多租戶、動態代理池 |
-Dhttp.proxyHost=... -Dhttp.proxyPort=... 而非代碼硬編碼nonProxyHosts 排除內網調用Proxy 而非依賴系統屬性