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

HttpClient 獲取重定向後最終 URL:HttpContext 狀態上下文實戰

     編輯:Java 相關知識

背景:HttpClient 默認自動跟隨重定向

訪問 A → 302 → B,HttpClient 直接返回 B 的內容。但業務常需要知道 **最終落地 URL** (B) 以便記錄、審計、防劫持。

核心 API:HttpContext 保存交互狀態

public class HttpClientDemo {
    public static void getRedirectInfo() {
        HttpClient httpClient = new DefaultHttpClient();
        HttpContext context = new BasicHttpContext(); // 關鍵:攜帶狀態
        HttpGet get = new HttpGet("https://127.0.0.1:8088/blog/main.jsp");

        try {
            HttpResponse response = httpClient.execute(get, context); // 傳入 context

            // 1. 獲取最終目標主機
            HttpHost targetHost = (HttpHost) context.getAttribute(ExecutionContext.HTTP_TARGET_HOST);
            // 2. 獲取最終請求 URI (含路徑、查詢參數)
            HttpUriRequest realRequest = (HttpUriRequest) context.getAttribute(ExecutionContext.HTTP_REQUEST);

            System.out.println("最終主機: " + targetHost);           // https://127.0.0.1:8088
            System.out.println("最終 URI: " + realRequest.getURI()); // /blog/admin/login.jsp

            // 可選:讀取響應體
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                System.out.println(EntityUtils.toString(entity));
                EntityUtils.consume(entity);
            }
        } catch (Exception e) { e.printStackTrace(); }
        finally { httpClient.getConnectionManager().shutdown(); }
    }
}

關鍵常量說明

常量含義類型
ExecutionContext.HTTP_TARGET_HOST最終解析的目標主機 (scheme+host+port)HttpHost
ExecutionContext.HTTP_REQUEST實際發出的請求對象 (含最終 URI)HttpUriRequest
ExecutionContext.HTTP_RESPONSE最終響應對象HttpResponse
ExecutionContext.HTTP_CONNECTION底層連接對象HttpConnection

進階用法:自定義 Context 屬性

// 請求前放入
context.setAttribute("my-trace-id", UUID.randomUUID().toString());
// 後續攔截器/處理器取出
String traceId = (String) context.getAttribute("my-trace-id");

HttpContext 是客戶端請求鏈路的「黑盒記錄儀」,善用它能解決重定向追蹤、鏈路追蹤、會話保持等一系列問題。

遷移提示:HttpClient 4.5+ / 5.x

  • 4.5+:HttpClientBuilder.create().build() 替代 new DefaultHttpClient();
  • 5.x:API 大幅變更,改用 ClassicHttpClient、HttpClientContext,核心思想不變。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved