Fetch API 使用詳解:Bearer Token 與 localStorage 實踐

????????Fetch API:現代瀏覽器內置的用于發送 HTTP 請求的 API,Bearer Token:一種基于令牌的身份驗證方案,常用于 JWT 認證,localStorage:瀏覽器提供的持久化存儲方案,用于在客戶端存儲數據。

? ? ? ? token是我們前端獲取后端數據的令牌,


// 登錄函數 - 調用真實后端API
async function loginUser(username, password) {try {const response = await fetch(`${API_URL}/auth/login`, {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({username: username,password: password})});// 檢查響應狀態if (!response.ok) {const errorData = await response.json();throw new Error(errorData.message || '登錄失敗');}// 解析響應數據const data = await response.json();// 從響應中獲取token(后端返回的token字段)const token = data.token;// 將token存入localStoragelocalStorage.setItem('authToken', token);return token;} catch (error) {console.error('登錄錯誤:', error);throw error;}
}

? ? ? ? 我們通過輸入的賬戶密碼,從前端表格中獲取,然后在這個登錄函數中參數是我們輸入的賬戶密碼,然后我們通過fetch我們的后端發送請求,通過我們的賬戶密碼來驗證,后端對應的路由上的方法接受賬戶密碼后生成我們賬戶專屬的token,方便我們查看我們自己賬戶的數據,然后用localStorage.setItem來保存我們用戶的token。這函數是通過我們的登錄的賬戶密碼向后端申請我們賬戶的token,方便我們調用后端數據。有token才能訪問加密數據。

????????

// 獲取受保護數據 - 使用Bearer Token
async function getProtectedData() {// 從localStorage獲取tokenconst token = localStorage.getItem('authToken');if (!token) {throw new Error('未找到Token,請先登錄');}try {const response = await fetch(`${API_URL}/protected/data`, {headers: {'Authorization': `Bearer ${token}`}});// 檢查Token是否有效if (response.status === 401) {// Token無效或過期localStorage.removeItem('authToken');throw new Error('Token已過期,請重新登錄');}if (!response.ok) {throw new Error('獲取數據失敗');}return await response.json();} catch (error) {console.error('請求錯誤:', error);throw error;}
}

? ? ? ? 這是我們通過loginuser函數獲取token后就可以通過const response = await fetch(`${API_URL}/protected/data`, { headers: { 'Authorization': `Bearer ${token}` } });直接訪問后端api然后獲取加密數據了,比如我們的賬戶個人信息,我們可以在很多地方使用token。

????????

// 在登錄按鈕事件中使用
loginBtn.addEventListener('click', async () => {const username = usernameInput.value;const password = passwordInput.value;try {// 調用真實后端APIconst token = await loginUser(username, password);// 更新UI顯示tokenDisplay.innerHTML = `<strong>獲取的Token:</strong> ${token}`;showResponse('登錄成功!Token已存儲');} catch (error) {showResponse(`登錄失敗: ${error.message}`, 'error');}
});

? ? ? ? 我們在登錄按鈕點擊登錄的時候添加事件,看我們的后端數據庫是否存在我們的賬戶密碼,如果有對應的token說明賬戶密碼存在,如果報錯沒找到,就登錄失敗。也就是如果登錄成功順便拿我們的token令牌。

????????

// 在獲取受保護數據按鈕中使用
getProtectedDataBtn.addEventListener('click', async () => {try {// 使用Bearer Token獲取數據const data = await getProtectedData();showResponse(`受保護數據: ${JSON.stringify(data, null, 2)}`);} catch (error) {showResponse(`獲取失敗: ${error.message}`, 'error');}
});

????????

// 模擬受保護的API調用function simulateProtectedApiCall(token) {// 驗證token格式if (!token || token.split('.').length !== 3) {throw new Error('Invalid token');}// 模擬API響應return {id: 1,userId: 1,title: "受保護的數據",body: "這是一個需要有效Bearer Token才能訪問的數據示例。",accessTime: new Date().toISOString()};}

? ? ? ? 這段是函數通過前面登錄拿到的token之后,通過判斷token的格式,如果token確實是我們設置的格式,也就是說token是對的,我們就返回我們的加密數據。然后點擊按鈕調用這個函數,就可以顯示出我們的加密數據了,和我們在網站登錄后查看個人信息一樣。

????????

// 后端示例(Node.js/Express)
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();app.use(express.json());// 登錄端點
app.post('/auth/login', (req, res) => {const { username, password } = req.body;// 1. 驗證用戶憑證(實際應查詢數據庫)if (username !== 'demo_user' || password !== 'demo_password') {return res.status(401).json({ message: '無效憑證' });}// 2. 生成JWT Tokenconst token = jwt.sign({ userId: '123', username: 'demo_user' }, // 負載(payload)'YOUR_SECRET_KEY', // 密鑰{ expiresIn: '1h' } // 有效期);// 3. 返回Token給前端res.json({ token });
});// 受保護的數據端點
app.get('/protected/data', (req, res) => {// 1. 獲取Authorization頭const authHeader = req.headers.authorization;if (!authHeader || !authHeader.startsWith('Bearer ')) {return res.status(401).json({ message: '缺少Token' });}const token = authHeader.split(' ')[1];try {// 2. 驗證Tokenconst decoded = jwt.verify(token, 'YOUR_SECRET_KEY');// 3. 返回受保護數據res.json({message: '歡迎訪問受保護數據',user: decoded.username,protectedData: [/* 敏感數據 */]});} catch (err) {return res.status(401).json({ message: '無效Token' });}
});

? ? ? ? 這是后端代碼部分。前面的app.post是login發送的請求,通過接受前端發來的賬戶密碼,我們去數據庫中查詢是否存在,然后驗證通過 后生成專屬的token密鑰返回給前端,前端就可以拿著token密鑰來訪問保護數據了。

? ? ? ? 后面的get接口,是我們在點擊顯示保護數據按鈕之后,我們函數體首先拿到我們登錄后存取的localStorge.setItem(token),然后在請求頭中'Authorization': `Bearer ${token}`加上這個來告訴后端我們有token可以獲取加密數據,然后點擊按鈕發送后端app.get路由,后端驗證發送的token是否和后端的一致,一致則返回json響應體里面是受保護的數據,然后前端在發送命令后修改文本為響應體返回來的數據文本,這個過程就實現了。

? ? ? ? 這是登錄的時候我們通過token,以及fetch實現了前后端數據的流動,也就是登錄的時候驗證并且加載出我們的個人信息,還有相關的數據通過get獲取都需要token來驗證是否可以獲取,然后記住通過localStorge.getItem,localStorge.setItem來存儲token。

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

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

相關文章

Netty自定義協議解析

目錄 自定義協議設計 實現消息解碼器 實現消息編碼器 自定義消息對象 配置ChannelPipeline Netty提供了強大的編解碼器抽象基類,這些基類能夠幫助開發者快速實現自定義協議的解析。 自定義協議設計 在實現自定義協議解析之前,需要明確協議的具體格式。例如,一個簡單的…

馭碼 CodeRider 2.0 產品體驗:智能研發的革新之旅

馭碼 CodeRider 2.0 產品體驗&#xff1a;智能研發的革新之旅 在當今快速發展的軟件開發領域&#xff0c;研發效率與質量始終是開發者和企業關注的核心。面對開發協作流程繁瑣、代碼生成補全不準、代碼審核低效、知識協同困難以及部署成本與靈活性難以平衡等問題&#xff0c;…

NLP學習路線圖(二十六):自注意力機制

一、為何需要你?序列建模的困境 在你出現之前,循環神經網絡(RNN)及其變種LSTM、GRU是處理序列數據(如文本、語音、時間序列)的主流工具。它們按順序逐個處理輸入元素,將歷史信息壓縮在一個隱藏狀態向量中傳遞。 瓶頸顯現: 長程依賴遺忘: 隨著序列增長,早期信息在傳遞…

【渲染】Unity-分析URP的延遲渲染-DeferredShading

我是一名資深游戲開發&#xff0c;小時候喜歡看十萬個為什么 介紹 本文旨在搞清楚延遲渲染在unity下如何實現的&#xff0c;為自己寫延遲渲染打一個基礎&#xff0c;打開從知到行的大門延遲渲染 輸出物體表面信息(rt1, rt2, rt3, …) 著色(rt1, rt2, rt3, …)研究完感覺核心…

華為OD機考- 簡單的自動曝光/平均像素

import java.util.Arrays; import java.util.Scanner;public class DemoTest4 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的區別while (in.hasNextLine()) { // 注意 while 處理多個 caseint[] arr Array…

java 樂觀鎖的實現和注意細節

文章目錄 1. 前言樂觀鎖 vs. 悲觀鎖&#xff1a;基本概念對比使用場景及優勢簡述 2. 基于版本號的樂觀鎖實現代碼示例注意事項 3. 基于CAS機制的樂觀鎖實現核心思想代碼示例關鍵點說明 4. 框架中的樂觀鎖實踐MyBatis中基于版本號的樂觀鎖實現示例代碼 JPA&#xff08;Hibernate…

河北對口計算機高考C#筆記(2026高考適用)---持續更新~~~~

C#筆記 C#發展史 1998年,C#發布第一個版本。2002年,visual studio開發環境推出C#的特點 1.語法簡潔,不允許直接操作內存,去掉了指針操作 2.徹底面向對象設計。 3.與Web緊密結合。 4.強大的安全機制,語法錯誤提示,引入垃圾回收器機制。 5.兼容性。 6.完善的錯誤,異常處理…

C# dll版本沖突解決方案

隨著項目功能逐漸增加&#xff0c;引入三方庫數量也會增多。不可避免遇到庫的間接引用dll版本沖突&#xff0c;如System.Memory.dll、System.Buffer.dll等。編譯會報警&#xff0c;運行可能偶發異常。 可使用ILMerge工具合并動態庫&#xff0c;將一個庫的多個dll合并為一個dll。…

深度解析:etcd 在 Milvus 向量數據庫中的關鍵作用

目錄 &#x1f680; 深度解析&#xff1a;etcd 在 Milvus 向量數據庫中的關鍵作用 &#x1f4a1; 什么是 etcd&#xff1f; &#x1f9e0; Milvus 架構簡介 &#x1f4e6; etcd 在 Milvus 中的核心作用 &#x1f527; 實際工作流程示意 ?? 如果 etcd 出現問題會怎樣&am…

隨機訪問介質訪問控制:網絡中的“自由競爭”藝術

想象一場自由辯論賽——任何人隨時可以發言&#xff0c;但可能多人同時開口導致混亂。這正是計算機網絡中隨機訪問協議的核心挑戰&#xff1a;如何讓多個設備在共享信道中高效競爭&#xff1f;本文將深入解析五大隨機訪問技術及其智慧。 一、核心思想&#xff1a;自由競爭 沖突…

設計模式作業

package sdau;public class man {public static void main(String[] args) {show(new Cat()); // 以 Cat 對象調用 show 方法show(new Dog()); // 以 Dog 對象調用 show 方法Animal a new Cat(); // 向上轉型 a.eat(); // 調用的是 Cat 的 eatCat c (Cat)a…

Kaspa Wasm SDK

文章目錄 1. 簡要2. github地址 1. 簡要 kaspa wallet SDK&#xff0c;在官方WASM基礎上封裝了應用層的方法&#xff0c;簡便了WASM的初始化及調用。 核心功能包括如下&#xff1a; 賬戶地址生成及管理Kaspa Api 和 Kasplex Api的封裝kaspa結點RPC 封裝P2SH的各個場景script封…

ROS mapserver制作靜態地圖

ROS mapserver制作靜態地圖 靜態地圖構建 1、獲取一個PNG地圖&#xff0c;二值化 2、基于PNG地圖&#xff0c;生成PGM地圖&#xff0c;可以通過一些網站在線生成&#xff0c;例如Convertio 文件配置 1、將文件放置于/package/map路徑下。 2、編寫yaml文件&#xff0c;如下…

tree 樹組件大數據卡頓問題優化

問題背景 項目中有用到樹組件用來做文件目錄&#xff0c;但是由于這個樹組件的節點越來越多&#xff0c;導致頁面在滾動這個樹組件的時候瀏覽器就很容易卡死。這種問題基本上都是因為dom節點太多&#xff0c;導致的瀏覽器卡頓&#xff0c;這里很明顯就需要用到虛擬列表的技術&…

瀏覽器工作原理05 [#] 渲染流程(上):HTML、CSS和JavaScript是如何變成頁面的

引用 瀏覽器工作原理與實踐 一、提出問題 在上一篇文章中我們介紹了導航相關的流程&#xff0c;那導航被提交后又會怎么樣呢&#xff1f;就進入了渲染階段。這個階段很重要&#xff0c;了解其相關流程能讓你“看透”頁面是如何工作的&#xff0c;有了這些知識&#xff0c;你可…

DrissionPage爬蟲包實戰分享

一、爬蟲 1.1 爬蟲解釋 爬蟲簡單的說就是模擬人的瀏覽器行為&#xff0c;簡單的爬蟲是request請求網頁信息&#xff0c;然后對html數據進行解析得到自己需要的數據信息保存在本地。 1.2 爬蟲的思路 # 1.發送請求 # 2.獲取數據 # 3.解析數據 # 4.保存數據 1.3 爬蟲工具 Dris…

android 布局小知識點 隨記

1. 布局屬性的命名前綴規律 與父容器相關的前綴 layout_alignParent&#xff1a;相對于父容器的對齊方式。 例如&#xff1a;layout_alignParentTop"true"&#xff08;相對于父容器頂部對齊&#xff09;。layout_margin&#xff1a;與父容器或其他控件的邊距。 例如…

GeoDrive:基于三維幾何信息有精確動作控制的駕駛世界模型

25年5月來自北大、理想汽車和 UC Berkeley 的論文“GeoDrive: 3D Geometry-Informed Driving World Model with Precise Action Control”。 世界模型的最新進展徹底改變動態環境模擬&#xff0c;使系統能夠預見未來狀態并評估潛在行動。在自動駕駛中&#xff0c;這些功能可幫…

Java高頻面試之并發編程-25

hello啊&#xff0c;各位觀眾姥爺們&#xff01;&#xff01;&#xff01;本baby今天又來報道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面試官&#xff1a;CAS都有哪些問題&#xff1f;如何解決&#xff1f; CAS 的問題及解決方案 CAS&#xff08;Compare and Swap&#xff0…

從碳基羊駝到硅基LLaMA:開源大模型家族的生物隱喻與技術進化全景

在人工智能的廣袤版圖上&#xff0c;一場從生物學羊駝到數字智能體的奇妙轉變正在上演。Meta推出的LLaMA(Large Language Model Meta AI)系列模型&#xff0c;不僅名字源自美洲駝(llama)&#xff0c;更以其開源特性和強大性能&#xff0c;引領了開源大模型社區的“駝類大爆發”…