Hutool HttpRequest 首次請求正常 第二次被系統攔截

Hutool HttpRequest 首次請求正常 第二次被系統攔截

  • 功能描述
    • 異常現象
      • 錯誤代碼
    • 異常排查
    • 問題跟蹤
    • 問題總結
    • 處理方案
    • 最終修改后的代碼

功能描述

需要請求第三方某個接口,獲取接口中的數據。

異常現象

使用main 方法 通過Hutool 工具類發出請求,獲取數據信息時,發現第一次請求接口可以正常獲取數據項,但是循環遍歷請求接口時,除首次請求外,其他請求都被第三方接口攔截,提示需要登錄。

錯誤代碼

String url = "http://xxx/kk/hh/f?page=1&limit=15";for(int i = 0;i<10;i++){HttpRequest http = HttpRequest.get(url);http.header("Accept", "application/json, text/javascript, */*; q=0.01").header("Accept-Encoding", "gzip, deflate, br").header("Connection", "keep-alive").header("Cookie", "kkid=sdf456sadf45dsf6ds4f; Token=15sd4f5ds6ads54f5sdf45dsf")HttpResponse tt = http.execute();String body = tt.body();}

異常排查

1.由于每次的首次請求都可以成功,排除接口無法請求或做了防重復請求之類的限制。
2.使用 java.net.HttpURLConnection 請求可以正常使用,再次排除接口問題,同時鎖定可能是Hutool的問題

問題跟蹤

1.跟蹤Hutool HttpRequest 的 execute() -> doExecute();

	// 最終執行到這個方法private HttpResponse doExecute(boolean isAsync, Chain<HttpRequest> requestInterceptors, Chain<HttpResponse> responseInterceptors) {// 請求前的攔截方法,可以實現該方法,對請求攔截后處理if (null != requestInterceptors) {Iterator var4 = requestInterceptors.iterator();while(var4.hasNext()) {HttpInterceptor<HttpRequest> interceptor = (HttpInterceptor)var4.next();interceptor.process(this);}}// 獲取請求參數this.urlWithParamIfGet();// 初始化連接,此次問題出現在改方法中this.initConnection();// 發送請求this.send();//接受響應信息HttpResponse httpResponse = this.sendRedirectIfPossible(isAsync);if (null == httpResponse) {httpResponse = new HttpResponse(this.httpConnection, this.config, this.charset, isAsync, this.isIgnoreResponseBody());}// 請求響應體攔截,如果項對響應信息做處理,可以實現該方法if (null != responseInterceptors) {Iterator var7 = responseInterceptors.iterator();while(var7.hasNext()) {HttpInterceptor<HttpResponse> interceptor = (HttpInterceptor)var7.next();interceptor.process(httpResponse);}}return httpResponse;}

2.根據首次和其他次的請求,鎖定了原因是請求頭中的cookie不一致導致,上述方法中的this.initConnection()方法。

	// 初始化httpConnectionprivate void initConnection() {// 判斷當前hutool的httpConnection 是否不為空,不為空則關閉連接if (null != this.httpConnection) {this.httpConnection.disconnectQuietly();}// 創建一個新的httpConnection this.httpConnection = HttpConnection.create(this.url.setCharset(this.charset).toURL(this.urlHandler), this.config.proxy).setConnectTimeout(this.config.connectionTimeout).setReadTimeout(this.config.readTimeout).setMethod(this.method).setHttpsInfo(this.config.hostnameVerifier, this.config.ssf).setInstanceFollowRedirects(false).setChunkedStreamingMode(this.config.blockSize).header(this.headers, true);// 判斷cookie 是否為空,不為空就設置cookieif (null != this.cookie) {this.httpConnection.setCookie(this.cookie);} else { // 否則就從已經建立的連接中獲取cookie(響應體的coolie),添加到cookie中// 由于此處我的cookie 為空,所以直接執行此處,此方法將上一次請求中響應回來的cookie,自動設置到我下一次的請求的請求頭中,導致請求頭中 key 為Cookie中,導致請求頭中有三個key為Cookie的參數,從而導致第三方接口取cookie 時異常,判斷非法。GlobalCookieManager.add(this.httpConnection);}if (this.config.isDisableCache) {this.httpConnection.disableCache();}}

3.由于上述方法的cookie 為空,所以直接執行GlobalCookieManager.add(this.httpConnection),此方法將上一次請求中響應回來的cookie,自動設置到我下一次的請求的請求頭中,導致請求頭中 key 為Cookie中,導致請求頭中有三個key為Cookie的參數,從而導致第三方接口取cookie 時異常,判斷非法。

	// 添加全局Cookiepublic static void add(HttpConnection conn) {// 判斷cookie 管理器是否為空,為空則不對cookie進行操作,此處便是解決問題的關鍵。if (null != cookieManager) {Map cookieHeader;try {// 從連接中獲取上次響應體返回的cookiecookieHeader = cookieManager.get(getURI(conn), new HashMap(0));} catch (IOException var3) {throw new IORuntimeException(var3);}// 將其添加至請求頭中,使用的是addRequestProperty,不是setRequestPropertyconn.header(cookieHeader, false);}}

問題總結

Hutool HttpRequest 將上一次請求中響應回來的cookie 添加到下一次的請求頭中(key為cookie),
導致第三方使用cookie 驗證登錄信息的地方失效,從而請求被攔截

處理方案

將 問題跟蹤-> 步驟3中 cookieManager 對象設置為空,使其跳過 cookie 設置
由于cookieManager 是個靜態對象,其類GlobalCookieManager 中提供setCookieManager 方法
HttpRequest 中也提供 了關閉cookie 的方法(此關閉cookie,就是讓cookieManager 對象為空的動作),所以處理方案有兩個,經測試,兩者都可以實現關閉操作

  1. GlobalCookieManager.setCookieManager(null);
  2. HttpRequest .closeCookie();

最終修改后的代碼

String url = "http://xxx/kk/hh/f?page=1&limit=15";
// 此方法為全局方法,如果確實需要此操作,在需要的地方還需再次設置cookieManager  對象HttpRequest .closeCookie()for(int i = 0;i<10;i++){HttpRequest http = HttpRequest.get(url);http.header("Accept", "application/json, text/javascript, */*; q=0.01").header("Accept-Encoding", "gzip, deflate, br").header("Connection", "keep-alive").header("Cookie", "kkid=sdf456sadf45dsf6ds4f; Token=15sd4f5ds6ads54f5sdf45dsf")HttpResponse tt = http.execute();String body = tt.body();}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161292.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161292.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161292.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網絡運維與網絡安全 學習筆記2023.11.22

網絡運維與網絡安全 學習筆記 第二十三天 今日目標 VLAN間通信之交換機、VLAN間通信綜合案例、浮動路由 VRRP原理與配置、VRRP鏈路跟蹤、VRRP安全認證 VLAN間通信之交換機 單臂路由的缺陷 在內網的VLAN數量增多時&#xff0c;單臂鏈路容易成為網絡瓶頸 三層交換機 具備…

react中模塊化樣式中:global的作用

在react中如果是通過import styles from ./index.less這種方式模塊化引入樣式的話&#xff0c;那么編譯后的less文件里的樣式名都會自動添加后綴。而:global的作用就是不讓類名添加后綴

利用 Apache Ranger 管理 Amazon EMR 中的數據權限

需求背景簡介 系統安全通常包括兩個核心主題&#xff1a;身份驗證和授權。一個解決“用戶是誰”的問題&#xff0c;另一個解決“用戶允許執行什么操作”的問題。在大數據領域&#xff0c;Apache Ranger 是最受歡迎的授權選擇之一&#xff0c;它支持所有主流大數據組件&#xff…

微機原理_1

一、單項選擇題(本大題共15小題,每小題3分,共45分。在每小題給出的四個備選項中,選出一個正確的答案,請將選定的答案填涂在答題紙的相應位置上。) 1,下列8086CPU標志寄存器的標志位中,不屬于狀態標志位的是(&#xff09; A. OF B. IF C. AF D. PF 8086微處理器可尋址訪問的最大…

面試中vue-router的一些知識點

Vue Router Vue Router使用舉例說明 vue-router 中 route和router的區別與聯系 route和router的區別與聯系 vue3 路由使用vue2 路由與vue3 路由的區別與聯系 Vue Router Vue Router是Vue.js官方的路由管理器&#xff0c;用于實現單頁面應用中的路由功能。它允許我們在Vue應用程…

萬界星空科技SMT行業生產管理MES系統解決方案

一、SMT行業特點&#xff1a; SMT&#xff08;Surface Mounted Technology&#xff09;作為電子組裝行業里首先的技術和工藝&#xff0c;選擇合適的MES解決方案來保障SMT生產的成功至關重要。 電子行業涉及的范圍非常廣&#xff0c;包含了汽車、電腦、電視、手機等產品上&…

HCIA-Datacom跟官方路線學習

通過兩次更換策略。最后找到最終的學習方案&#xff0c;華為ICT官網有對這個路線的學習&#xff0c;hcia基礎有這個學習路線&#xff0c;hcip也有目錄路線。所以&#xff0c;最后制定學習路線&#xff0c;是根據這個認證的路線進行學習了&#xff1a; 官網課程&#xff1a;課程…

scala 實現表達式解析

表達式解析 import org.junit.Testimport scala.collection.mutableclass ExprTestCase {private val orderSource "source_1"private val saleChannel "saleChannel"val datas new mutable.HashMap[String, String]();// p1, source1, sale1, source…

everything的高效使用方法

目錄 前言1 everything的簡單介紹2 常用搜索3 語法搜索4 正則表達式搜索5 服務器功能 前言 本文介紹everything軟件的高效使用方法&#xff0c;everything是一款在系統中快速搜索文件的軟件&#xff0c;能夠幫助人們快速定位需要查找的文件。首先介紹everything軟件的作用和使…

掌握 AI 和 NLP:深入研究 Python — 情感分析、NER 等

一、說明 我們見證了 BERT 等預訓練模型在情感分析方面的強大功能,使我們能夠破譯隱藏在文本數據中的情感。通過 SpaCy,我們探索了命名實體識別的迷人世界,揭開了隱藏在非結構化文本中的秘密。 二、問題陳述 命名實體識別(NER)是自然語言處理中的一項關鍵…

數字化時代的政務服務:構建便捷高效的線上政務大廳

引言&#xff1a; 隨著數字化時代的來臨&#xff0c;如何通過線上政務大廳搭建一個便捷高效的服務平臺&#xff0c;以更好地滿足公眾需求值得探究。線上政務大廳是政務服務的新方式&#xff0c;但搭建線上政務大廳并不是一件容易的事情&#xff0c;需要精心的規劃和設計。 一…

【藍橋杯選拔賽真題25】C++兩個數比大小 第十三屆藍橋杯青少年創意編程大賽C++編程選拔賽真題解析

目錄 C/C++兩個數比大小 一、題目要求 1、編程實現 2、輸入輸出 二、算法分析

Linux文件I/O:基本概念

Linux是一個開源的操作系統&#xff0c;它提供了一套豐富的文件I/O&#xff08;輸入/輸出&#xff09;接口&#xff0c;讓用戶和程序可以方便地對文件進行讀寫操作。文件I/O是操作系統中最基本也最重要的功能之一&#xff0c;它涉及到文件的打開、關閉、讀取、寫入、定位、鎖定…

centos無法進入系統之原因解決辦法集合

前言 可愛的小伙伴們&#xff0c;由于精力有限&#xff0c;暫時整理了兩類。如果沒有你遇到的問題也沒有關系&#xff0c;歡迎底下留言評論或私信&#xff0c;小編看到后第一時間幫助解決 一. Centos 7 LVM xfs文件系統修復 情況1&#xff1a; [sda] Assuming drive cache:…

Bean基本注解開發

Commponent 使用Component注解代替<bean>標簽 <!--注解掃描:掃描指定的基本包及其子包下的類&#xff0c;識別使用了Component注解的文件--><context:component-scan base-package"org.xfy"></context:component-scan> package org.xfy.Dao.…

【Web】preg_match繞過相關例題wp

目錄 ①[FBCTF 2019]rceservice ②[ctfshow]web130 ③[ctfshow]web131 ④[NISACTF 2022]middlerce 簡單回顧一下基礎 參考文章 p牛神文 preg_match繞過總的來講就三塊可利用 數組繞過、PCRE回溯次數限制、換行符 ①[FBCTF 2019]rceservice 先貼出附件給的源碼 &l…

使用electron工具打包web端到PC端應用程序

根據electron官網快速入門示例可以方便的構建mac端包&#xff0c;我們在此基礎上構建windows端exe包. 1在package.json文件的script字段增加以下配置 "scripts": {..."build": "electron-builder --win"}, 2然后在終端執行以下命令 npm run b…

Modbus TCP

Modbus &#xff08;&#x1f446; 百度百科&#xff0c;放心跳轉&#xff09; 起源 Modbus 由 Modicon 公司于 1979 年開發&#xff0c;是一種工業現場總線協議標準。 Modbus 通信協議具有多個變種&#xff0c;支持串口&#xff0c;以太網多個版本&#xff0c;其中最著名的…

基于STM32的數字圖像處理與模式識別算法優化

基于STM32的數字圖像處理與模式識別算法優化是一項涉及圖像處理和機器學習領域的研究任務&#xff0c;旨在實現高效的圖像處理和模式識別算法在STM32微控制器上的運行。本文將介紹基于STM32的數字圖像處理與模式識別算法優化的原理和實現步驟&#xff0c;并提供相應的代碼示例。…

圖神經網絡與圖注意力網絡

隨著計算機行業和互聯網時代的不斷發展與進步&#xff0c;圖神經網絡已經成為人工智能和大數據的重要研究領域。圖神經網絡是對相鄰節點間信息的傳播和聚合的重要技術&#xff0c;可以有效地將深度學習的理念應用于非歐幾里德空間的數據上。本期推送圍繞圖神經網絡與圖注意力網…