Apache HttpClient 4.5.x 學習總結七:HTTP protocol interceptors(HTTP協議攔截器)
通俗解釋
想象HTTP攔截器是快遞分揀流水線上的工人:
1. 各司其職
- 工人A專貼"易碎品"標簽(處理頭部)
- 工人B專做防震包裝(內容壓縮)
- 工人C專做禮品盒(裝飾器模式包裝)
2. 協作方式
- 工人們通過共享記事本(HTTP上下文) 傳遞信息
- 例如記錄當前包裹是今天第100件(跨請求計數器)
3. 工作規則
- 工人順序無關,除非有依賴(如先包裝再貼標簽)
- 所有工具必須公用且線程安全(避免多人爭搶資源)
4. 實際場景
// 給每件包裹自動編號的工人
.addInterceptorLast((包裹, 記事本) -> {
計數器 = 記事本.get("計數");
包裹貼標簽("編號:" + 計數器++);
})
通過記事本實現連續10個包裹自動編號(1,2,3...10)
翻譯
HTTP協議攔截器是用于實現HTTP協議特定功能的程序。它通常針對請求/響應消息中的特定頭部或相關頭部進行操作,也可操作消息內容實體(如透明壓縮/解壓縮)。攔截器通過裝飾器模式包裝原始實體,多個攔截器可組合成邏輯單元。
攔截器通過HTTP執行上下文(HTTP context) 共享信息(如處理狀態)。其執行順序通常無關緊要,但存在依賴時需按順序添加到協議處理器。攔截器必須實現為線程安全,避免使用非同步的實例變量。
示例:通過上下文在連續請求間傳遞計數狀態:
// 創建帶計數攔截器的HTTP客戶端
CloseableHttpClient httpclient = HttpClients.custom()
.addInterceptorLast((request, context) -> {
AtomicInteger count = (AtomicInteger) context.getAttribute("count");
request.addHeader("Count", Integer.toString(count.getAndIncrement()));
}).build();
// 設置上下文初始值
AtomicInteger count = new AtomicInteger(1);// 初始化計數器為1
HttpClientContext localContext = HttpClientContext.create();
localContext.setAttribute("count", count);//存入上下文
// 連續執行10次請求
for (int i = 0; i < 10; i++) {
CloseableHttpResponse response = httpclient.execute(new HttpGet("http://localhost/"), localContext);
// 處理響應...
}
AtomicInteger count = new AtomicInteger(1);是 Java 中的一段代碼,其核心含義是:創建一個初始值為 1 的原子整數計數器
逐層拆解:
-
AtomicInteger- Java 提供的線程安全整數類
- 專為多線程環境設計,保證操作的原子性(操作不可被中斷)
-
new AtomicInteger(1)- 實例化一個原子整數對象
- 括號中的
1表示初始值(計數器從 1 開始)
** 關鍵特性(為什么不用普通 int?)**
普通 int |
AtomicInteger |
|---|---|
| ? 非線程安全 | ? 線程安全 |
? i++ 在多線程中會出錯 |
? getAndIncrement() 是原子操作 |
| ? 無并發控制機制 | ? 基于 CAS 實現無鎖并發 |
count.getAndIncrement()等價于:- 讀取當前值(如
1) - 自動執行
值+1(變成2) - 返回原始值(返回
1)
- 讀取當前值(如
- 每次請求時:
第1次請求 → 添加 Header: "Count:1" → 值變成2
第2次請求 → 添加 Header: "Count:2" → 值變成3
...依此類推
示例中實現「跨請求連續計數」的關鍵:即使 HTTP 客戶端在多線程環境下處理請求,也能保證每個請求獲得唯一遞增的編號
知識點提煉
1. 核心功能
- 處理特定HTTP頭部
- 操作消息內容實體(如壓縮/解壓縮)
- 通過裝飾器模式包裝原始實體
2. 協作機制
- 使用HTTP上下文(HttpContext) 跨請求共享數據(如計數器)
3. 執行順序
- 默認執行順序無關,存在依賴時需顯式指定添加順序
4. 線程安全
- 禁止使用非同步的實例變量(類似Servlet規范)
5. 狀態持久化
- 上下文可保存跨請求的狀態(示例中的計數器)
關鍵理解:攔截器像可插拔的功能模塊,通過共享的"記事本"協作,高效安全地處理HTTP消息的各個環節。
浙公網安備 33010602011771號