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

Java 應用透過 HTTP Proxy 存取網際網路資源 (java.net.URL 篇)

     編輯:Java 相關知識

企業內部應用常部署於無直連外網的 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

若 Proxy 需帳密,可實作 Authenticator:


Authenticator.setDefault(new Authenticator() {
    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication("proxyUser", "proxyPass".toCharArray());
    }
});

或在 URL 中內嵌 (不推薦,日誌洩露風險):https://user:pass@proxy:port

四、程式化精確控制 (ProxySelector / Proxy)

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 訪外網的混合場景。

五、常見問題排查

  • 連線逾時:檢查 Proxy IP/Port、防火牆、http.nonProxyHosts 設定錯誤導致內網誤走 Proxy
  • 407 Proxy Authentication Required:未設定 Authenticator 或帳密錯誤
  • HTTPS 失敗:未設定 https.proxyHost/Port、或需 SSL 憑證信任 (JSSE 配置)
  • 系統屬性不生效:在 URL.openConnection() 前設定,且不可被 SecurityManager 限制
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved