雖然 4.0 重構巨大,但 3.1 API 穩定、文檔豐富、依賴少 (commons-logging, commons-codec),適合快速構建模擬瀏覽器行為的自動化腳本。
commons-httpclient-3.1.jar
commons-logging.jar
commons-codec-1.3.jar
// 內部 Cookie 數組
private Cookie[] cookies = new Cookie[0];
// 執行前注入
client.getState().addCookies(cookies);
method.addRequestHeader("Cookie", cookies.toString());
// 執行後更新
cookies = client.getState().getCookies();
手動同步 `HttpState` 與請求頭,確保會話連續性 (HttpClient 3.x 不自動處理重定向時的 Cookie)。
Protocol myhttps = new Protocol("https", new MySecureProtocolSocketFactory(), 443);
Protocol.registerProtocol("https", myhttps);
需自行實現 `MySecureProtocolSocketFactory` (基於 JSSE),信任所有證書或加載自定義信任庫。
method.setRequestHeader("Accept", "*/*");
method.setRequestHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1;)");
method.setRequestHeader("Connection", "Keep-Alive"); // 關鍵:複用連接
if (statusCode == 301 || statusCode == 302) {
String location = method.getResponseHeader("Location").getValue();
redirectToURL(location); // 遞歸 GET 新地址
}
同步 Cookie 後跳轉,模擬瀏覽器行為。
client.getHostConfiguration().setProxy(proxyIp, proxyPort);
client.getParams().setAuthenticationPreemptive(true);
public String login(Siteusers user, Proxyips proxy) {
SiteLogin login = new SiteLogin(context, "https://login.kaixin.com/Login.do");
if (proxy != null) login.getContext().setProxyip(proxy);
Map<String,String> 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、處理重定向、返回響應
}
public String post(Postinfos post, List<Siteboards> boards) {
context.getClient().getHostConfiguration().setHost("blog.kaixin.com"); // 切換 Host
SitePost sp = new SitePost(context);
Map<String,String> params = new HashMap<>();
params.put("categoryId", "0");
params.put("blogControl", "1");
params.put("title", post.getTitle());
params.put("body", post.getContent());
sp.addRequestParameters(params);
for (Siteboards b : boards) {
b.setPostUrl("https://blog.kaixin.com/NewEntry.do");
sp.post(post, b); // 遍歷版塊發帖
}
return null;
}
| 問題 | 解決方案 |
|---|---|
| 中文亂碼 | `client.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "UTF-8")` + 頁面編碼一致 |
| Cookie 丟失導致登錄態中斷 | 手動同步 `HttpState` + 請求頭 `Cookie`,重定向時攜帶 |
| 連接未釋放導致洩漏 | `finally` 塊 `method.releaseConnection()`,雙重保險 |
| JS 重定向 (window.location) 無法捕獲 | 響應體解析正則提取 URL → `redirectToURL()` 繼續訪問 |
| 驗證碼頁面 | 本框架不處理,需接入打碼平台或人工介入 |
| 反爬蟲:User-Agent、Referer、頻率限制 | 模擬真實瀏覽器頭、隨機睡眠、IP 代理池輪換 |
HttpClient 3.x 憑藉 `BrowserContext` 封裝 Cookie/代理/HTTPS/重定向、`SiteLogin`/`SitePost` 命令模式封裝業務動作,構建了清晰可擴展的模擬瀏覽器自動化框架。理解**有狀態上下文管理**、**HTTP 協議細節 (重定向、Cookie、編碼)**、**反爬蟲對抗基礎**三大核心,即可快速適配新站點。新項目請直接拥抱 HttpClient 4.5+ 或 OkHttp,享受異步、連接池、HTTP/2 紅利。