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

Java HttpClient 4.x 模擬瀏覽器登錄實戰:從抓包分析到代碼實現

     編輯:Java 綜合教學

HttpClient 模擬登錄全流程:抓包獲取參數 → 代碼實現自動化操作

利用 Apache HttpClient 模擬瀏覽器發送 POST 請求完成登錄,後續可攜帶 Cookie 進行業務操作 (發帖、爬數據等)。核心難點在於獲取真實登錄表單參數與提交 URL。

第一步:抓包分析 (必經之路)

  1. 工具:Firefox 插件 HttpFox (或 Fiddler/Charles/瀏覽器 F12 Network 面板)。
  2. 操作:清空記錄 → Start 捕獲 → 瀏覽器正常登錄 → Stop 捕獲。
  3. 分析:找到 Method=POST 的登錄請求,記錄:
    • URL:表單提交的真實 action 地址 (可能非登錄頁 URL)。
    • Post Data / Parameters:所有 `name=value` 對 (用戶名、密碼、隱藏域 token、驗證碼等)。
    • Headers:`Content-Type: application/x-www-form-urlencoded`、可能的 `Referer`、`User-Agent`、`Cookie` (如預登錄設置)。

第二步:核心代碼實現 (HttpClient 4.5+ Fluent API / Classic API)

import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.NameValuePair;
import java.util.ArrayList;
import java.util.List;

public class LoginSimulator {
    public static void main(String[] args) throws Exception {
        // 1. 創建客戶端 (自動管理 Cookie Store)
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            
            // 2. 構建 POST 請求
            String loginUrl = "https://target-site.com/login.action"; // 抓包獲取
            HttpPost httpPost = new HttpPost(loginUrl);
            
            // 3. 設置表單參數 (抓包獲取的 name/value)
            List formParams = new ArrayList<>();
            formParams.add(new BasicNameValuePair("username", "your_user"));
            formParams.add(new BasicNameValuePair("password", "your_pwd"));
            formParams.add(new BasicNameValuePair("csrf_token", "extracted_token")); // 如有隱藏域
            
            // 4. 設置實體與編碼 (目標站點編碼,抓包或嘗試 GBK/UTF-8)
            httpPost.setEntity(new UrlEncodedFormEntity(formParams, "GBK")); 
            
            // 5. 模擬瀏覽器 Header (關鍵:防反爬)
            httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
            httpPost.setHeader("Referer", "https://target-site.com/login.jsp");
            
            // 6. 執行請求
            try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
                int status = response.getStatusLine().getStatusCode();
                String respBody = EntityUtils.toString(response.getEntity(), "UTF-8");
                System.out.println("Status: " + status);
                System.out.println("Body: " + respBody);
                
                // 7. 登錄成功後,httpClient 內部 CookieStore 已保存 Session Cookie
                // 後續請求直接用同一 httpClient 實例即可自動攜帶 Cookie
            }
        }
    }
}

進階必知點

場景處理方案
驗證碼簡單圖形驗證碼:下載圖片 → OCR 識別 (Tesseract/深度學習) → 填入表單。複雜滑動/點選:需 Selenium/WebDriver 真實瀏覽器自動化。
動態 Token / 簽名分析 JS 加密邏輯 (斷點調試/逆向),Java 重現算法生成簽名;或嵌入 JS 引擎 (Nashorn/GraalVM) 直接調用原 JS。
重定向處理登錄常返回 302 重定向。HttpClient 默認自動跟隨重定向 (可配置 `LaxRedirectStrategy`),最終落地頁即登錄後頁面。
HTTPS / SSL信任所有證書 (測試用):自定義 `SSLConnectionSocketFactory` + `TrustStrategy` 返回 true。生產需導入正規 CA 證書。
連接池複用高併發場景使用 `PoolingHttpClientConnectionManager` 共享連接池,配置 `MaxTotal`, `DefaultMaxPerRoute`。

法律與道德紅線

⚠️ 僅用於授權測試、個人數據導出、學習研究。 未經授權繞過驗證、大規模爬取、暴力破解均屬違法。請遵守 `robots.txt`、網站服務條款、《網絡安全法》。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved