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

Java 程序穿透帶密碼驗證的 HTTP 代理完整實現

     編輯:Java 相關知識

核心難點

  • Authenticator.setDefault() 全局生效,需線程安全。
  • Base64 編碼:JDK 8 前無標準 API,需自行實現或用 sun.misc.BASE64Encoder(不推薦)。

完整代碼(JDK 8+ 推薦寫法)

import java.io.*;
import java.net.*;
import java.util.Base64;

public class ProxyConnTest {
    public static void initProxy(String host, int port, final String user, final String pwd) {
        Authenticator.setDefault(new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(user, pwd.toCharArray());
            }
        });
        System.setProperty("http.proxyHost", host);
        System.setProperty("http.proxyPort", String.valueOf(port));
        System.setProperty("http.proxySet", "true");
        // HTTPS 另需設置 https.proxyHost/Port
    }

    public static void main(String[] args) throws IOException {
        String url = "https://java.sun.com/";
        String proxy = "your.proxy.host";
        int port = 8080;
        String user = "username";
        String pwd = "password";

        initProxy(proxy, port, user, pwd);

        URL server = new URL(url);
        HttpURLConnection conn = (HttpURLConnection) server.openConnection();
        conn.connect();

        try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
        }
    }
}

關鍵點說明

  1. PasswordAuthentication 構造函數接受 char[] 密碼,比 String 更安全。
  2. 系統屬性 http.proxyHost/Port/Set 必須在建立連接前設置。
  3. HTTPS 代理需額外設置 https.proxyHost、https.proxyPort,且可能涉及 SSL 憑證驗證。
  4. SOCKS 代理另行配置 socksProxyHost/Port。

Base64 手動實現(JDK 7 兼容)

static String encodeBase64(String input) {
    return new String(Base64.getEncoder().encode(input.getBytes("UTF-8"))); // JDK 8+
    // JDK 7: 使用 Apache Commons Codec 或自寫 Base64 編碼器
}

若不使用 Authenticator,可手動設置 Proxy-Authorization 請求頭:

String auth = user + ":" + pwd;
String encoded = Base64.getEncoder().encodeToString(auth.getBytes());
conn.setRequestProperty("Proxy-Authorization", "Basic " + encoded);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved