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

HttpClient 3.1 模擬瀏覽器登錄發帖回覆完整實戰

     編輯:Java 相關知識

技術選型

Apache Commons HttpClient 3.1(舊版 API,穩定廣泛使用),依賴 commons-logging、commons-codec。核心優勢:自動維護 Cookie、支援 HTTPS/代理、完整 HTTP 方法封裝。

架構設計

  • BrowserContext:瀏覽器上下文,持有 HttpClient、Cookie 陣列、代理 IP、登錄用戶,封裝 GET/POST/重定向處理、通用請求頭設置。
  • SiteLogin / SitePost:具體站點登錄與發帖邏輯,構建參數映射、調用 Context 執行請求。
  • ISitePost:統一介面,支援多站點擴展(開心網、其他論壇)。

關鍵代碼片段

BrowserContext 核心

public class BrowserContext {
    private HttpClient client;
    private Cookie[] cookies = new Cookie[0];
    // ... proxy、user 管理

    public String doGet(GetMethod get) throws IOException {
        if (cookies != null) {
            client.getState().addCookies(cookies);
            get.addRequestHeader("Cookie", cookies.toString());
        }
        setCommonHeaders(get);
        int status = client.executeMethod(get);
        cookies = client.getState().getCookies(); // 更新 Cookie
        if (status == 301 || status == 302) redirectToURL(get.getResponseHeader("Location").getValue());
        return get.getResponseBodyAsString();
    }
    // doPost 同理,支援 ExpectContinueMethod
    private void setCommonHeaders(HttpMethodBase m) {
        m.setRequestHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)");
        m.setRequestHeader("Connection", "Keep-Alive"); // 關鍵:長連接
    }
}

開心網登錄實現

public class KaixinSitePost implements ISitePost {
    private BrowserContext context;
    public String login(Siteusers user, Proxyips ip) {
        SiteLogin login = new SiteLogin(context, "https://login.kaixin.com/Login.do");
        if (ip != null) login.getContext().setProxyip(ip);
        Map params = new HashMap<>();
        params.put("ss", "10106");
        params.put("loginregFrom", "index");
        params.put("origURL", "https://www.kaixin.com/SysHome.do");
        params.put("email", user.getUsername());
        params.put("password", user.getUserpwd());
        login.addRequestParameters(params);
        return login.login(user);
    }
    // post/reply 類似,構建參數調用 SitePost
}

關鍵技術點

  • Cookie 自動維護:client.getState().addCookies() + 手動添加 Cookie Header 雙重保險。
  • 重定向處理:301/302 狀態碼下自動提取 Location 再次請求。
  • 代理支援:HostConfiguration.setProxy(ip, port) + 認證憑證。
  • 編碼設置:HttpMethodParams.HTTP_CONTENT_CHARSET 解決中文亂碼。
  • 長連接:Connection: Keep-Alive 減少握手開銷。

遷移提示

HttpClient 4.x/5.x API 變化巨大(CloseableHttpClient、HttpGet/HttpPost、RequestConfig 等),遷移時需重寫請求構建與響應處理邏輯,但核心設計模式(Context、SiteLogin、SitePost)可保留。

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