企業內部應用常部署於無直連外網的 LAN 環境,需透過 HTTP Proxy 存取網路資源。java.net.URL 原生支援系統屬性配置 Proxy,無需修改業務代碼。本文示範最簡配置方式與完整驗證代碼。
在 JVM 啟動參數或代碼初始化階段設定:
// 代碼中設定 (需在首次 URL 連線前)
System.setProperty("http.proxyHost", "192.168.1.111");
System.setProperty("http.proxyPort", "8080"); // Proxy 埠口
// HTTPS 另需
System.setProperty("https.proxyHost", "192.168.1.111");
System.setProperty("https.proxyPort", "8080");
// 排除內網位址不走 Proxy
System.setProperty("http.nonProxyHosts", "localhost|192.168.*|10.*|*.internal.corp");
或啟動參數:java -Dhttp.proxyHost=... -Dhttp.proxyPort=... MyApp
import java.net.*;
import java.io.*;
import java.util.Properties;
public class TestHttpProxy {
public static void main(String[] args) {
String targetUrl = "https://java.sun.com/index.html"; // 測試目標
// 設定 Proxy (實際部署建議放在啟動腳本/容器配置)
Properties prop = System.getProperties();
prop.put("http.proxyHost", "192.168.1.111");
prop.put("http.proxyPort", "8080");
try {
URL url = new URL(targetUrl);
System.out.println("Target URL: " + url);
URLConnection conn = url.openConnection();
System.out.println("Connection: " + conn.getClass().getName());
System.out.println("Content-Type: " + conn.getContentType());
try (InputStream is = url.openStream()) {
int ch = is.read();
System.out.println("First byte: " + ch);
// 可選:讀取前 200 bytes 驗證內容
byte[] buf = new byte[200];
int len = is.read(buf);
System.out.println("Preview: " + new String(buf, 0, len, "UTF-8"));
}
System.out.println("✅ Proxy 連線成功!");
} catch (Exception e) {
System.err.println("❌ 連線失敗: " + e.getMessage());
e.printStackTrace();
}
}
}
若 Proxy 需帳密,可實作 Authenticator:
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("proxyUser", "proxyPass".toCharArray());
}
});
或在 URL 中內嵌 (不推薦,日誌洩露風險):https://user:pass@proxy:port
JDK 5+ 提供 Proxy 類別精確控制單一連線:
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("192.168.1.111", 8080));
URL url = new URL("https://java.sun.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection(proxy);
// 此連線強制走指定 Proxy,忽略系統屬性
適用於同一應用需同時直連內網與走 Proxy 訪外網的混合場景。
http.nonProxyHosts 設定錯誤導致內網誤走 Proxyhttps.proxyHost/Port、或需 SSL 憑證信任 (JSSE 配置)URL.openConnection() 前設定,且不可被 SecurityManager 限制