在企業網路環境中,為了保護內部資安,通常會斷絕內部網路與網際網路的直接連線,並透過 Proxy Server(代理伺服器) 作為中介,管控內部用戶對外部資源的存取。Java 應用程式若要在這樣的環境下正常運作,必須具備透過 Proxy 連線的能力。幸運的是,Java 只需設定幾個系統屬性,即可輕鬆支援 Proxy,無需任何安全性「漏洞」或複雜的底層操作。
Java 執行期提供了一組未正式文件化、但在開發者社群廣為流傳的系統屬性,用於控制 Proxy 行為。在建立任何網路連線之前,必須先在程式碼中設定以下屬性:
System.getProperties().put("proxySet", "true");
System.getProperties().put("proxyHost", "myProxyMachineName");
System.getProperties().put("proxyPort", "85");
proxySet=true:告知 Java 運行環境將透過 Proxy 連線。proxyHost:指定 Proxy 伺服器的主機名稱或 IP 位址。proxyPort:指定 Proxy 伺服器監聽的連接埠號碼。部分 Proxy 伺服器要求使用者提供帳號密碼才能通過驗證。Java 透過調整 HTTP Request Header 中的 Proxy-Authorization 欄位來傳遞憑證。憑證格式為 username:password,並需經過 Base64 編碼。
URL url = new URL("https://example.com");
URLConnection connection = url.openConnection();
String password = "username:password";
String encodedPassword = Base64.getEncoder().encodeToString(password.getBytes()); // Java 8+ 內建 Base64
connection.setRequestProperty("Proxy-Authorization", "Basic " + encodedPassword);
注意:早期版本常使用
sun.misc.BASE64Encoder,但此類屬於內部 API,不建議在生產環境使用。現代 Java 應優先使用java.util.Base64。
若需透過 Proxy 進行 FTP 傳輸,需設定對應的 FTP 系統屬性:
System.getProperties().put("ftpProxySet", "true");
System.getProperties().put("ftpProxyHost", "proxy-host-name");
System.getProperties().put("ftpProxyPort", "21");
設定完成後,即可直接使用 ftp:// 協定的 URL 進行操作。
支援 SOCKS4 協定的 Proxy 設定方式如下:
System.getProperties().put("socksProxySet", "true");
System.getProperties().put("socksProxyHost", "proxyHostName");
System.getProperties().put("socksProxyPort", "1080"); // SOCKS4 預設連接埠
proxyHost/proxyPort 可能失效,需改用 new URL(String protocol, String host, int port, String file) 建構子,直接指定 Proxy 主機與連接埠。Basic (含空白),否則伺服器會拒絕驗證。在 Java 應用程式中加入 Proxy 支援並不困難,關鍵在於正確設定系統屬性與處理認證 Header。掌握上述技巧後,即可讓應用程式在受限的企業網路環境中,順暢存取網際網路資源。