首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 設置網絡代理的兩種方式詳解:全局屬性 vs Proxy API

     編輯:Java 相關知識

前言

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

特點:簡單、全局生效、無法針對單個連接單獨設置、需在程序啟動早期配置。

方式二:使用 Proxy API(精確控制)

為單個連接指定代理,不影響其他連接。支持 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)
需修改連接創建代碼
多代理支持
困難
原生支持
適用場景
統一出口代理、容器側車模式
爬蟲、多租戶、動態代理池

最佳實踐

  1. 優先考慮啟動參數 -Dhttp.proxyHost=... -Dhttp.proxyPort=... 而非代碼硬編碼
  2. 生產環境建議配置 nonProxyHosts 排除內網調用
  3. 代理認證信息勿硬編碼,從配置中心/密鑰管理系統讀取
  4. 使用連接池 (如 Apache HttpClient) 時,配置其 Proxy 而非依賴系統屬性
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved