前端防重復請求終極方案:從Loading地獄到精準攔截的架構升級

🔥 事故現場還原:瘋狂點擊引發的血案

凌晨1點23分,監控系統突然告警:

📉 服務器CPU飆升至98%
🗃? 數據庫出現3000+臟數據
💥 用戶端彈出上百個錯誤彈窗

事故原因:黑產腳本通過0.5秒內發起200次領券請求,導致系統雪崩!
老板批示:48小時內必須實現前端全局防重復請求!


🚨 技術攻堅:三大致命難題

難點破解思路實施風險
500+存量接口改造全局攔截器方案????
文件上傳特殊場景兼容FormData特征識別???
現有Loading體系兼容發布訂閱模式??

?? 方案PK:從青銅到王者的進化之路

方案一:粗暴Loading法(新手必踩坑)

// 請求攔截器偽代碼
axios.interceptors.request.use(config => {showLoading(); // 全局Loadingreturn config;
});// 致命缺陷:連續點擊導致Loading套娃

缺陷分析
? 開發速度:5分鐘
? 用戶體驗:多個Loading疊加
? 安全隱患:無法防御腳本攻擊

方案二:哈希攔截法(中級工程師陷阱)

const requestMap = new Map();function generateKey(config) {return `${config.method}-${config.url}`; // 關鍵參數丟失!
}// 真實案例翻車現場
axios.get('/api?page=1'); // 正常
axios.get('/api?page=2'); // 被誤攔截!

哈希碰撞測試
10萬次請求參數交換測試,碰撞率高達17.3%!💣


🏆 終極方案:發布訂閱+精準指紋(高可用架構)

系統架構設計

存在未完成
不存在
新請求
生成唯一指紋
注冊監聽器
發起真實請求
返回緩存結果
響應成功/失敗
廣播結果
清理緩存

核心代碼實現(生產級)

class RequestControl {constructor() {this.pending = new Set();this.emitter = new EventEmitter(); // 自定義事件中心}// 生成唯一指紋(解決哈希碰撞)generateKey(config) {const { method, url, params, data } = config;const hash = window.location.hash;return crypto.createHash('md5').update(`${method}-${url}-${JSON.stringify(params)}-${this._handleFormData(data)}-${hash}`).digest('hex');}// 處理FormData特殊場景_handleFormData(data) {if (data instanceof FormData) {return Array.from(data.entries()).toString();}return data;}
}

攔截器完整配置

// 請求攔截器
axios.interceptors.request.use(config => {const key = generateKey(config);if (requestControl.pending.has(key)) {return new Promise((resolve, reject) => {requestControl.emitter.once(key, ({ status, data }) => {status === 'success' ? resolve(data) : reject(data);});}).catch(error => {return Promise.reject({ __isCacheError: true, error });});}requestControl.pending.add(key);return config;
});// 響應攔截器
axios.interceptors.response.use(response => {const key = generateKey(response.config);requestControl.emitter.emit(key, { status: 'success', data: response });requestControl.pending.delete(key);return response;
}, error => {const key = generateKey(error.config);requestControl.emitter.emit(key, { status: 'error', data: error });requestControl.pending.delete(key);return Promise.reject(error);
});

🧪 特殊場景解決方案

場景1:文件上傳防誤殺

function isUploadRequest(config) {return config.headers['Content-Type']?.includes('multipart/form-data');
}// 生成文件特征碼
function generateFileKey(formData) {return Array.from(formData.entries()).map(([name, file]) => `${name}-${file.name}-${file.size}`).join('|');
}

場景2:頁面跳轉兜底處理

window.addEventListener('beforeunload', () => {requestControl.pending.clear();requestControl.emitter.removeAllListeners();
});

📊 性能壓測報告(JMeter 1000并發)

指標原始方案哈希方案終極方案
平均響應時間326ms217ms189ms
錯誤率38%12%0.3%
內存占用1.2GB860MB720MB

🔧 工程化建議(血淚經驗)

  1. 調試模式:增加環境變量控制攔截器開關

    if (process.env.NODE_ENV === 'development') {window.__ENABLE_REQUEST_INTERCEPTOR = false; 
    }
    
  2. 權重系數:對關鍵接口設置優先級

    const API_WEIGHT = {'/api/payment': 3,  // 高權重'/api/list': 1     // 低權重
    };
    
  3. 僵尸清理:30秒自動釋放未響應請求

    setInterval(() => {const now = Date.now();requestControl.pending.forEach((timestamp, key) => {if (now - timestamp > 30000) {requestControl.pending.delete(key);}});
    }, 5000);
    

🚀 技術總結
通過發布訂閱模式+精準請求指紋的方案,我們不僅按時交付需求,還意外提升了系統整體性能。該方案已在生產環境穩定運行3個月,成功攔截惡意請求超1200萬次!

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

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

相關文章

基于Spring Boot的供應商管理系統設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導,歡迎高校老師/同行前輩交流合作?。 技術范圍:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容:…

Redis|事務

文章目錄 是什么能干嘛Redis 事務 VS 數據庫事務怎么玩小總結 是什么 首先回想一下什么是數據庫的事務?數據庫事務是指作為單個邏輯單元執行的一系列操作,具備以下四個關鍵特性(ACID): 原子性(Atomicity&am…

一周學會Flask3 Python Web開發-Jinja2模板繼承和include標簽使用

鋒哥原創的Flask3 Python Web開發 Flask3視頻教程: 2025版 Flask3 Python web開發 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 不管是開發網站還是后臺管理系統,我們頁面里多多少少有公共的模塊。比如博客網站,就有公共的頭部&…

二十三種設計模式詳解

二十三種設計模式是軟件開發中用于解決常見問題的經典解決方案,它們由 Erich Gamma 等四位作者在《設計模式:可復用面向對象軟件的基礎》一書中提出。這些模式分為三大類:創建型模式、結構型模式 和 行為型模式。 1. 創建型模式(…

用pyside6創建一個界面并實現一個小功能且能打包成問題記錄

現在我們要開發一個程序,讓用戶輸入一段文本包含:員工姓名、薪資、年齡。該程序可以把薪資在 2萬 以上、以下的人員名單分別打印出來。 1用designer創建界面并生成UI文件; 2直接調用ui文件實現功能; from PySide6.QtWidgets im…

計算機畢業設計 ——jspssm510springboot 的人職匹配推薦系統

作者:程序媛9688 開發技術:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等。 🌟文末獲取源碼數據庫🌟 感興趣的可以先收藏起來,還有大家在畢設選題(免費咨詢指導選題)&#xf…

包子湊數——藍橋杯真題Python

包子湊數 輸入輸出樣例 示例 1 輸入 2 4 5輸出 6樣例說明 湊不出的數目包括:1, 2, 3, 6, 7, 11。 示例 2 輸入 2 4 6輸出 INF樣例說明 所有奇數都湊不出來,所以有無限多個 運行限制 最大運行時間:1s最大運行內存: 256M 最大公約數 最大公…

SSM和SpringBoot有什么區別?

SSM(Spring、Spring MVC、MyBatis)和 Spring Boot 有以下一些區別: 配置方式 SSM:配置相對繁瑣,需要在多個 XML 文件中進行大量的配置。Spring Boot:采用“約定大于配置”的原則,極大地簡化了配…

極簡Python服務器后端

在Python中,可以使用http.server模塊和json模塊來創建一個簡單的HTTP服務器,該服務器可以響應80端口上的/query POST請求,并且請求體為JSON格式。 需要注意,在Linux系統上,使用低于1024的端口(如80端口&…

文檔檢索服務平臺

文檔檢索服務平臺是基于Elasticsearch的全文檢索,包含數據采集、數據清洗、數據轉換、數據檢索等模塊。 項目地址:Github、國內Gitee 演示地址:http://silianpan.cn/gdss/ 以下是演示角色和賬號(密碼同賬號)&#xf…

關于Postman自動獲取token

在使用postman測試聯調接口時,可能每個接口都需要使用此接口生成的令牌做Authorization的Bearer Token驗證,最直接的辦法可能會是一步一步的點擊,如下圖: 在Authorization中去選擇Bearer Token,然后將獲取到的token粘貼…

清華大學DeepSeek文檔下載,清華大學deepseek下載(完成版下載)

文章目錄 前言一、清華大學DeepSeek使用手冊下載二、清華大學DeepSeek使用手冊思維導圖 前言 這是一篇關于清華大學deepseek使用手冊pdf的介紹性文章,主要介紹了DeepSeek的定義、功能、使用方法以及如何通過提示語設計優化AI性能。以下是對這些核心內容的簡要概述&…

Linux:(3)

一:Linux和Linux互傳(壓縮包) scp:Linux scp 命令用于 Linux 之間復制文件和目錄。 scp 是 secure copy 的縮寫, scp 是 linux 系統下基于 ssh 登陸進行安全的遠程文件拷貝命令。 scp 是加密的,rcp 是不加密的,scp 是…

【新人系列】Python 入門專欄合集

? 個人博客:https://blog.csdn.net/Newin2020?typeblog 📝 專欄地址:https://blog.csdn.net/newin2020/category_12801353.html 📣 專欄定位:為 0 基礎剛入門 Python 的小伙伴提供詳細的講解,也歡迎大佬們…

Arcgis 實用制圖技巧--如何制作“陰影”效果

今天給大家介紹arcgis中陰影效果的制作方法,操作很簡單,在ArcMap當中使用制圖表達和移動幾何方式就可以輕松實現。 左側地圖的圖形背景組織很差。右側地圖通過使用陰影效果突出了重點內容。今天,我將要介紹兩種陰影效果的創建方法:第一,純色陰影(single color);第二,漸變…

pandas如何在dataframe上再添加一個dataframe

在pandas中,通常將一個DataFrame與另一個DataFrame進行合并或連接操作,主要有concat函數、merge函數和join方法三種方式,以下是具體介紹: ### 使用concat函數 concat函數可以沿著指定軸將多個DataFrame連接在一起,默認…

YOLOv12 ——基于卷積神經網絡的快速推理速度與注意力機制帶來的增強性能結合

概述 實時目標檢測對于許多實際應用來說已經變得至關重要,而Ultralytics公司開發的YOLO(You Only Look Once,只看一次)系列一直是最先進的模型系列,在速度和準確性之間提供了穩健的平衡。注意力機制的低效阻礙了它們在…

OpenAI開放Deep Research權限,AI智能體大戰升級,DeepSeek與Claude迎來新對決

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎?訂閱我們的簡報,深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同,從行業內部的深度分析和實用指南中受益。不要錯過這個機會,成為AI領…

鴻蒙5.0實戰案例:基于RichEditor的評論編輯

往期推文全新看點(文中附帶全新鴻蒙5.0全棧學習筆錄) ?? 鴻蒙(HarmonyOS)北向開發知識點記錄~ ?? 鴻蒙(OpenHarmony)南向開發保姆級知識點匯總~ ?? 鴻蒙應用開發與鴻蒙系統開發哪個更有前景&#…

通過命令啟動steam的游戲

1. 啟動Steam客戶端 在命令行輸入以下命令來啟動Steam客戶端: start steam://open/main 如果Steam未安裝在默認路徑,可能需要先定位到Steam的安裝目錄,例如: cd C:\Program Files (x86)\Steam start steam://open/main 2. 通過…