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

Android HttpClient 獲取驗證碼圖片返回亂碼?編碼處理與 Fiddler 抓包排查指南

     編輯:程式設計綜合問答

使用 Apache HttpClient 在 Android 獲取驗證碼圖片(ValidateCode.aspx)時,若直接將回應實體轉為位元組陣列解碼 Bitmap,卻得到亂碼或無法顯示,通常是回應內容非圖片(如 HTML 錯誤頁、重導向頁)或編碼處理錯誤。

常見原因與排查

  1. 未處理重導向:驗證碼頁面可能先 302 導向登入頁,HttpClient 預設不自動追蹤,需設定 HttpClientBuilder.create().setRedirectStrategy(new LaxRedirectStrategy()).build()。
  2. Cookie/Session 未維持:驗證碼需與後續登入請求共用 Session,必須使用同一個 DefaultHttpClient 實例(或共用 CookieStore)。
  3. 回應非圖片內容:伺服器回傳錯誤 HTML(如「Session 過期」),EntityUtils.toByteArray() 仍會轉換,導致 BitmapFactory.decodeByteArray 失敗或產生噪點圖。

正確實作模式

// 共用 HttpClient 與 CookieStore
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
CookieStore cookieStore = new BasicCookieStore();
localContext.setAttribute(HttpClientContext.COOKIE_STORE, cookieStore);

// 1. 獲取驗證碼
HttpGet getCode = new HttpGet("https://jwgl.gxufe.cn/jwweb/sys/ValidateCode.aspx");
HttpResponse resp = httpClient.execute(getCode, localContext);
int status = resp.getStatusLine().getStatusCode();
if (status == 200) {
    Header contentType = resp.getFirstHeader("Content-Type");
    if (contentType != null && contentType.getValue().startsWith("image/")) {
        byte[] bytes = EntityUtils.toByteArray(resp.getEntity());
        Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
        // 更新 UI 顯示 bitmap
    } else {
        // 非圖片內容,記錄錯誤
        String html = EntityUtils.toString(resp.getEntity());
        Log.e("CAPTCHA", "非圖片回應: " + html);
    }
}

// 2. 後續登入請求使用同樣 httpClient 與 localContext
HttpPost loginPost = new HttpPost("https://jwgl.gxufe.cn/jwweb/sys/login.aspx");
// ... 設定參數並執行

Fiddler 抓包驗證步驟

  1. 電腦開啟 Fiddler,設定 HTTPS 解密。
  2. 手機 Wi-Fi 代理指向電腦 Fiddler 端口(通常 8888)。
  3. 操作 App 獲取驗證碼,觀察 Fiddler 中請求/回應:
    - Request URL、Headers (Cookie)
    - Response Status、Content-Type、Body (是否為圖片二進位)
  4. 對比程式碼發出的請求與瀏覽器正常請求的差異(User-Agent, Cookie, Referer 等)。

關鍵修正點

  • ✅ 使用同一 HttpClient + HttpContext 維持 Cookie。
  • ✅ 檢查 Content-Type 確認為 image/* 再解碼。
  • ✅ 處理重導向策略。
  • ❌ 不要假設 URL 不變即可直接請求,驗證碼通常有防盜鏈或 Session 綁定。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved