退出登錄后頭像還在?這個緩存問題坑過多少前端!

目錄

1. 為什么退出登錄后頭像還在?

① 緩存沒清理干凈

② 頭像URL沒更新

③ 后端會話失效,但靜態資源可訪問

2. 怎么解決?5種常見方案

? 方案1:強制刷新頁面(簡單粗暴)

? 方案2:給頭像URL加時間戳(推薦)

? 方案3:清除前端緩存狀態

? 方案4:后端返回默認頭像(保險做法)

? 方案5:Service Worker 緩存控制(高級玩法)

3. 我踩過的坑:本地開發沒問題,上線出BUG

4. 終極解決方案:綜合策略

5. 總結

? ?寫在最后


大家好,我是小楊,一個干了6年的前端老司機。今天要聊一個看似簡單卻經常被忽略的問題——為什么用戶退出登錄后,頭像還顯示在頁面上?

這個問題我遇到過不止一次,甚至有一次差點被測試同學當成嚴重BUG提上來。其實背后的原因很簡單,但解決起來有幾個關鍵點需要注意。


1. 為什么退出登錄后頭像還在?

通常,頭像不會自動消失,主要有以下幾個原因:

① 緩存沒清理干凈
  • 瀏覽器緩存:圖片可能被瀏覽器緩存了,即使退出登錄,瀏覽器仍然顯示舊的頭像。

  • 前端狀態沒重置:Vue/React 的全局狀態(如 Vuex、Redux)可能還保留著用戶信息。

② 頭像URL沒更新

很多網站的頭像是通過URL加載的,比如:

<img src="https://example.com/avatars/我的頭像.jpg" />

如果退出登錄后,前端沒強制刷新頁面或更新URL,瀏覽器可能仍然顯示緩存中的舊圖片。

③ 后端會話失效,但靜態資源可訪問

即使退出登錄,頭像圖片如果放在公開可訪問的路徑下(如?/public/avatars/),瀏覽器仍然能加載到。


2. 怎么解決?5種常見方案

? 方案1:強制刷新頁面(簡單粗暴)

退出登錄后,直接?window.location.reload(),讓瀏覽器重新加載所有資源。

logout() {clearUserToken(); // 清除Tokenwindow.location.reload(); // 強制刷新
}

缺點:體驗不好,頁面會閃爍。

? 方案2:給頭像URL加時間戳(推薦)

在頭像URL后面加一個隨機參數,讓瀏覽器認為是新圖片:

<img :src="`/avatars/${user.avatar}?t=${Date.now()}`" />

或者用 Vue 的?v-if?控制顯示:

<img v-if="isLoggedIn" :src="user.avatar" />
? 方案3:清除前端緩存狀態

如果用了 Vuex/Pinia,退出時一定要清空用戶數據:

// store/user.js
actions: {logout() {this.user = null;localStorage.removeItem('token');}
}
? 方案4:后端返回默認頭像(保險做法)

如果用戶未登錄,后端可以返回一個默認頭像URL,而不是讓前端處理緩存問題。

? 方案5:Service Worker 緩存控制(高級玩法)

如果你用了 PWA,可以通過?Service Worker?動態控制緩存策略:

// service-worker.js
self.addEventListener('fetch', (event) => {if (event.request.url.includes('avatar')) {event.respondWith(fetch(event.request, { cache: 'no-store' }) // 不緩存頭像);}
});

3. 我踩過的坑:本地開發沒問題,上線出BUG

有一次,我在本地測試退出登錄功能,頭像正常消失。但上線后,用戶反饋退出后頭像還在!

原因

  • 本地開發時,瀏覽器沒緩存圖片。

  • 生產環境用了 CDN,圖片被緩存了,導致退出后仍然顯示舊頭像。

解決方案
在頭像URL后面加版本號,比如:

<img :src="`/avatars/${user.avatar}?v=${user.avatarVersion}`" />

每次用戶更新頭像,后端都更新?avatarVersion,這樣瀏覽器就會重新加載。


4. 終極解決方案:綜合策略

最佳實踐是?前端 + 后端?一起處理:

  1. 前端:退出時清空狀態,加隨機參數避免緩存。

  2. 后端:返回正確的 HTTP 緩存頭(如?Cache-Control: no-store)。


5. 總結

  • 問題根源:瀏覽器緩存 + 前端狀態沒清理干凈。

  • 解決方案

    • 加隨機參數(?t=時間戳

    • 清空 Vuex/Redux 狀態

    • 后端控制緩存策略

  • 高級方案:Service Worker 動態管理緩存

如果你也遇到過這個問題,歡迎在評論區分享你的解決方案! 🚀

? ?寫在最后


請大家不吝賜教,在下方評論或者私信我,十分感謝🙏🙏🙏.

? 認為我某個部分的設計過于繁瑣,有更加簡單或者更高逼格的封裝方式

? 認為我部分代碼過于老舊,可以提供新的API或最新語法

? 對于文章中部分內容不理解

? 解答我文章中一些疑問

? 認為某些交互,功能需要優化,發現BUG

? 想要添加新功能,對于整體的設計,外觀有更好的建議

? 一起探討技術加qq交流群:906392632

最后感謝各位的耐心觀看,既然都到這了,點個 👍贊再走吧!
?

?

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

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

相關文章

Windows下白嫖ClaudeCode

我的邀請鏈接&#xff1a;https://anyrouter.top/register?afffMJn 我的邀請鏈接&#xff1a;https://anyrouter.top/register?afffMJn 我的邀請鏈接&#xff1a;https://anyrouter.top/register?afffMJn 兄弟們&#xff0c;交個朋友啊&#xff01;一定要用我的呀&#xff0…

windows在anaconda中下載安裝fasttext

windows在anaconda中下載安裝fasttext 1.訪問fasttext-wheel&#xff0c;點擊對應鏈接&#xff0c;下載對應Python版本、操作系統類型 的.whl文件&#xff1a; 鏈接地址&#xff1a;https://pypi.org/project/fasttext-wheel/#files 打開anaconda終端&#xff0c;切換到上面的…

mysql5.7系列-索引下推(cover_index)

什么是索引下推 ICP&#xff08;Index Condition Pushdown&#xff09;是在MySQL 5.6版本上推出的查詢優化策略&#xff0c;把本來由Server層做的索引條件檢查下推給存儲引擎層來做&#xff0c;以降低回表和訪問存儲引擎的次數&#xff0c;提高查詢效率。 回顧下mysql的架構分…

計算機網絡(基礎概念)

計算機網絡&#xff08;基礎概念&#xff09;1 初識協議1.1 協議分層2 OSI七層模型2.1 物理層2.2 數據鏈路層2.3 網絡層2.4 傳輸層2.5 應用層3 TCP/IP協議族3.1 什么是TCP/IP協議?3.1.1 OS與網絡關系4 網絡傳輸的基本流程4.1 局域網4.2 MAC地址5 跨網絡傳輸5.1 IP地址6 Socket…

專題 JavaScript 函數基礎

你將知道&#xff1a;函數聲明和表達式函數聲明和表達式之間的區別什么是匿名函數什么是 IIFE命名函數表達式this 關鍵字函數是調用該函數時執行的代碼塊 。函數聲明和表達式讓我們回顧一下它的語法&#xff1a;functionfunctionName(param1, param2, ..., paramN) {// Functio…

數據結構——優先隊列(priority_queue)的巧妙運用

優先隊列是一種相對高級的數據結構&#xff0c;它的底層原理是二叉堆。然而本篇不會執著于深挖其背后的原理&#xff0c;更主要的是理一下它在題目中的一些實用方法&#xff0c;幫助你更快的上手使用。 優先隊列(priority_queue) 優先隊列的特別之處就在于它可以自動進行排序&…

Java:繼承和多態(必會知識點整理)

主要內容繼承多態向上轉型向下轉型方法重寫方法重載super關鍵字動態綁定封裝訪問控制構造方法規則一、繼承 1. 概念&#xff1a; 一句話說就是&#xff1a;“共性抽取&#xff0c;代碼復用”子類會將父類中的成員變量或者成員方法繼承到子類中子類繼承父類之后&#xff0c;必須…

基于esp32系列的開源無線dap-link項目使用介紹

基于esp32系列的開源無線dap-link項目使用介紹&#x1f516;有關esp32/8266相關項目&#xff1a;需要自己搭建編譯環境&#xff1a; https://github.com/windowsair/wireless-esp8266-dap/tree/master&#x1f33f;支持esp32/c3/s3,支持在線固件燒錄&#xff0c;支持AP配網&…

深入了解linux系統—— 進程信號的產生

前言 進程在收到信號之后&#xff0c;可以立即處理&#xff0c;也可以在合適的時間再處理&#xff08;1-31號普通信號可以不被立即處理&#xff09; 信號不是被立即處理&#xff0c;信號就要被保存下來&#xff0c;讓進程在合適的時間再去處理。 相關概念 在了解進程是如何保存…

【Bluedroid】藍牙協議棧enable流程深度解析

本文詳細剖析 Bluedroid 藍牙功能啟用的核心流程&#xff0c;從enable()函數觸發開始&#xff0c;深入解析藍牙協議棧的異步啟動機制、核心協議模塊初始化、硬件控制器綁定及狀態同步全流程。重點闡述接口就緒性檢查、異步線程管理、配置文件回調機制等關鍵環節&#xff0c;揭示…

各種開發語言主要語法對比

各類主流編程語言的語法有著顯著差異&#xff0c;這些差異源于語言設計哲學&#xff08;簡潔性 vs 顯式性&#xff09;、應用領域&#xff08;系統級、Web、數據科學&#xff09;、運行方式&#xff08;編譯 vs 解釋&#xff09;以及支持的范式&#xff08;面向對象、函數式、過…

小鵬汽車6月交付車輛34,611輛,同比增長224%

小鵬汽車-W(09868)發布公告&#xff0c;2025年6月&#xff0c;小鵬汽車共交付智能電動汽車34,611輛&#xff0c;同比增長224%&#xff0c;這標志著小鵬汽車已連續第八個月交付量超過了30,000輛。2025年第二季度&#xff0c;小鵬汽車共交付103,181 輛智能電動車&#xff0c;創下…

深入理解觀察者模式:構建松耦合的交互系統

在軟件開發中&#xff0c;我們經常遇到這樣的場景&#xff1a;一個對象的狀態變化需要通知其他多個對象&#xff0c;并且這些對象需要根據變化做出相應的反應。比如&#xff0c;用戶界面中的數據變化需要實時反映到多個圖表上&#xff0c;或者電商系統中的庫存變化需要通知訂單…

React強大且靈活hooks庫——ahooks入門實踐之常用場景hook

什么是 ahooks&#xff1f; ahooks 是一個 React Hooks 庫&#xff0c;提供了大量實用的自定義 hooks&#xff0c;幫助開發者更高效地構建 React 應用。其中場景類 hooks 是 ahooks 的一個重要分類&#xff0c;專門針對特定業務場景提供解決方案。 安裝 ahooks npm install …

Qt常用控件之QWidget(一)

Qt常用控件之QWidget&#xff08;一&#xff09;1.QWidget2.enabled屬性2.geometry&#x1f31f;&#x1f31f;hello&#xff0c;各位讀者大大們你們好呀&#x1f31f;&#x1f31f; &#x1f680;&#x1f680;系列專欄&#xff1a;【Qt的學習】 &#x1f4dd;&#x1f4dd;本…

AIOT開發選型:行空板 K10 與 M10 適用場景與選型深度解析

前言 隨著人工智能和物聯網技術的飛速發展&#xff0c;越來越多的開發者、學生和愛好者投身于創意項目的構建。 在眾多的開發板中&#xff0c;行空板 K10 和 M10 以其獨特的優勢脫穎而出。 本文旨在為讀者提供一份詳盡的行空板 K10 和 M10 對比分析&#xff0c;從適用場景、…

redis匯總筆記

語雀完整版&#xff1a; https://www.yuque.com/g/mingrun/embiys/calwqx/collaborator/join?tokensLcLnqz5Rv8hOKEB&sourcedoc_collaborator# 《Redis筆記》 Redis 一般問題 Redis內存模型&#xff08;I/O多路模型&#xff09;多路復用IO如何解釋 為什么Redis要使用單線…

STM32用PWM驅動步進電機

硬件介紹&#xff1a;連線&#xff1a;注意這里stp連的是pwm脈沖&#xff0c;dir連的是方向到時候代碼pwm波形就是從這里來的&#xff0c;具體接線根據你的代碼來注意要點&#xff1a;步進電機和舵機驅動是不一樣的&#xff0c;它是根據步長來移動的&#xff0c;所以要開一個中…

力扣25.7.10每日一題——重新安排會議得到最多空余時間 II

Description 今天這道題和昨天類似&#xff0c;只是允許順序變化。 Solution 把會議區間視作桌子&#xff0c;空余時間視作空位&#xff0c;我們要把一個桌子移到別的空位中。 初步想法是枚舉桌子&#xff0c;找一個長度大于等于桌子長度的空位移過去。看上去&#xff0c;找…

IP報文分片與重組原理及實現分析

IP報文分片與重組原理及實現分析 引用&#xff1a; ppp/net/packet/IPFragment.hppp/net/packet/IPFragment.cpp 1. IP分片原理 當IP數據包大小超過MTU&#xff08;最大傳輸單元&#xff09;時&#xff0c;路由器/主機將其分割為多個片段傳輸&#xff0c;每個片段包含&…