最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

前端登錄退出處理Token問題(獲取、緩存、失效處理)及代碼實(shí)現(xiàn)方法

 更新時(shí)間:2024年01月12日 09:27:17   作者:離奇6厘米  
token是一個(gè)用戶信息的表示,在登錄中將會(huì)從后端拿到token,然后用戶才可以進(jìn)行往后的一系列操作,這篇文章主要給大家介紹了關(guān)于前端登錄退出處理Token問題(獲取、緩存、失效處理)及代碼實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下

一、什么是Token

Token是服務(wù)端生成的一串字符串,當(dāng)用戶第一次登陸成功后,服務(wù)器會(huì)生成一個(gè)token,并將其返回給客戶端。

當(dāng)用戶再次向服務(wù)器請(qǐng)求數(shù)據(jù)時(shí),只需要攜帶著token請(qǐng)求數(shù)據(jù)即可,無需再次登陸用戶名和密碼

目的

通過token做一層數(shù)據(jù)攔截,可以減少數(shù)據(jù)庫(kù)請(qǐng)求次數(shù),減緩服務(wù)器壓力

二、獲取token

當(dāng)用戶第一次登陸成功之后,后臺(tái)會(huì)返回一個(gè)token給到客戶端,前端將token緩存到本地,然后每次發(fā)請(qǐng)求時(shí)需要在 header 里邊帶上 token,這個(gè)時(shí)候本地的 token 和后臺(tái)數(shù)據(jù)庫(kù)中的 token 進(jìn)行一個(gè)驗(yàn)證,如果兩者一致,則請(qǐng)求成功,否則失敗。

在這里插入圖片描述

三、Token失效處理

既然前后端通過token交互,如果一直有效,會(huì)有安全風(fēng)險(xiǎn),所以我們需要在客戶端進(jìn)行一下token的時(shí)間檢查
服務(wù)器的token一般不會(huì)設(shè)置太長(zhǎng),根據(jù)實(shí)際一般是1-7天,沒有一個(gè)token是永久的,永久的token就相當(dāng)于一串永久的密鑰,是不安全的。

token失效一般用兩種情形:

① 主動(dòng)退出:用戶點(diǎn)擊退出登錄按鈕后退出

② 被動(dòng)退出:token過期,或被人“頂號(hào)”退出

注意點(diǎn)

無論什么方式退出token,在用戶退出時(shí),所需要執(zhí)行的操作都是固定的

1、清理掉當(dāng)前用戶的緩存數(shù)據(jù)

2、清理掉相關(guān)權(quán)限的配置

3、返回到登錄頁(yè)面

1、主動(dòng)退出

用戶主動(dòng)點(diǎn)擊退出功能實(shí)現(xiàn)

user.js

// 獲取退出登錄
logout(context) {
  context.commit("removeToken"); // 刪除token
  context.commit("reomveUserInfo"); // 刪除用戶信息
},

2、Token過期

① 邏輯圖

②方案

在用戶登錄時(shí),記錄當(dāng)前的登錄時(shí)間

制定一個(gè)token時(shí)效時(shí)長(zhǎng)

在接口調(diào)用時(shí),根據(jù)當(dāng)前時(shí)間對(duì)比登錄時(shí)間,看是否超過了時(shí)效時(shí)間

如果未超過,則正常進(jìn)行后續(xù)操作,如果超過,則進(jìn)行退出登錄操作

③代碼實(shí)現(xiàn)

user.js

// 獲取登錄信息
async login(context, data) {
  const result = await loginInfo(data);
  context.commit("setToken", result);
  setTimeStamp(); // 寫入時(shí)間戳
},

auth.js

import Cookies from "js-cookie";
const timeKey = 'liqi6limi-timestamp-key' // 設(shè)置一個(gè)獨(dú)一無二的key

// 獲取時(shí)間戳
export function getTimeStamp() {
  return Cookies.get(timeKey)
}
// 設(shè)置時(shí)間戳
export function setTimeStamp() {
  Cookies.set(timeKey, Date.now())
}

// 設(shè)置超時(shí)時(shí)間
export const TimeOut = 3600; 

// 是否超時(shí)
export function IsCheckTimeOut() {
  var currentTime = Date.now(); // 當(dāng)前時(shí)間戳
  var timeStamp = getTimeStamp(); // 緩存時(shí)間戳
  return (currentTime - timeStamp) / 1000 > TimeOut;
}

request.js

import store from "@/store";
import axios from "axios";
import { getTimeStamp,IsCheckTimeOut } from "@/utils/auth";
import router from "@/router";

// 創(chuàng)建axios實(shí)例
const service = axios.create({
  baseURL: "/api",
  timeout: 5000,
});

// 請(qǐng)求攔截器
service.interceptors.request.use(
  (config) => {
    // 是否存在token
    if (store.getters.token) {
      if (IsCheckTimeOut()) {
        store.dispatch("user/logout"); // 退出登錄的action
        router.push("/login"); // 跳轉(zhuǎn)到登錄頁(yè)
        return Promise.reject(new Error("token超時(shí)了")); // 拋出的錯(cuò)誤,會(huì)在響應(yīng)攔截器的錯(cuò)誤捕捉中捕捉到
        console.log("超時(shí)");
      }
      config.headers["Authorization"] = `Bearer ${store.getters.token}`; // 如果token存在 注入token
    }
    return config; // 必須返回配置
  },
  (error) => {
    return Promise.reject(error);
  }
);

3、被人頂號(hào)

① 邏輯圖

② 方案

后端返回?cái)?shù)據(jù)時(shí),會(huì)返回特定的狀態(tài)碼通知前端

當(dāng)前端接收到特定狀態(tài)碼時(shí),表示遇到了特定狀態(tài):此時(shí)進(jìn)行退出登錄處理

③代碼實(shí)現(xiàn)

// 響應(yīng)攔截器
service.interceptors.response.use(
  (response) => {
    // axios默認(rèn)加了一層data
    const { success, message, data } = response.data;
    //   要根據(jù)success的成功與否決定下面的操作
    if (success) {
      return data;
    } else {
      // 業(yè)務(wù)已經(jīng)錯(cuò)誤了 
      Message.error(message); // 提示錯(cuò)誤消息
      return Promise.reject(new Error(message));
    }
  },
  (error) => {
    // error 信息 里面 response的對(duì)象
    if (
      error.response &&
      error.response.data &&
      error.response.data.code === 10002
    ) {
      // 當(dāng)?shù)扔?0002的時(shí)候 表示 后端告訴我token超時(shí)了
      store.dispatch("user/logout"); // 登出action 刪除token
      router.push("/login");
    } else {
      Message.error(error.message); // 提示錯(cuò)誤信息
    }
    return Promise.reject(error);
  }
);

總結(jié) 

到此這篇關(guān)于前端登錄退出處理Token問題(獲取、緩存、失效處理)及代碼實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)前端登錄退出處理Token問題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue實(shí)現(xiàn)頂部導(dǎo)航欄以及跳轉(zhuǎn)

    vue實(shí)現(xiàn)頂部導(dǎo)航欄以及跳轉(zhuǎn)

    這篇文章主要介紹了vue實(shí)現(xiàn)頂部導(dǎo)航欄以及跳轉(zhuǎn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 在vue2中實(shí)現(xiàn)截圖功能的基本步驟

    在vue2中實(shí)現(xiàn)截圖功能的基本步驟

    在Vue 2中實(shí)現(xiàn)截圖功能,可以使用HTML5的Canvas元素和一些JavaScript代碼來捕獲屏幕或特定元素的截圖,以下是一個(gè)簡(jiǎn)單的步驟和示例代碼來實(shí)現(xiàn)這個(gè)功能,需要的朋友可以參考下
    2023-10-10
  • Vue3中Suspense異步加載組件的問題

    Vue3中Suspense異步加載組件的問題

    在我們?nèi)粘i_發(fā)中,有些組件里面加載非常慢,導(dǎo)致我們路由跳轉(zhuǎn)的時(shí)候回出現(xiàn)卡頓情況,這篇文章主要介紹了Vue3:?Suspense異步加載組件,需要的朋友可以參考下
    2023-12-12
  • vue實(shí)現(xiàn)登錄時(shí)的圖片驗(yàn)證碼

    vue實(shí)現(xiàn)登錄時(shí)的圖片驗(yàn)證碼

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)登錄時(shí)的圖片驗(yàn)證碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Vue3如何自定義指令directive(如權(quán)限控制)

    Vue3如何自定義指令directive(如權(quán)限控制)

    本文詳細(xì)介紹了如何在Vue3項(xiàng)目中創(chuàng)建自定義指令directive1,首先,在src/directives/index.ts文件中引入自定義指令,然后,創(chuàng)建src/directives/permission.ts文件來定義具體指令邏輯,在main.ts文件中引入并注冊(cè)該指令,最后,在頁(yè)面中使用自定義指令
    2024-12-12
  • 解決vue的過渡動(dòng)畫無法正常實(shí)現(xiàn)問題

    解決vue的過渡動(dòng)畫無法正常實(shí)現(xiàn)問題

    今天小編就為大家分享一篇解決vue的過渡動(dòng)畫無法正常實(shí)現(xiàn)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • 使用?vite?external?減小產(chǎn)物體積的方法實(shí)現(xiàn)

    使用?vite?external?減小產(chǎn)物體積的方法實(shí)現(xiàn)

    本文主要介紹了使用?vite?external?減小產(chǎn)物體積,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-05-05
  • 使用 vue.js 構(gòu)建大型單頁(yè)應(yīng)用

    使用 vue.js 構(gòu)建大型單頁(yè)應(yīng)用

    本文給大家詳細(xì)介紹了如何使用使用 vue.js腳手架工具vue-cli構(gòu)建大型單頁(yè)應(yīng)用的方法,非常的實(shí)用,有需要的小伙伴可以參考下
    2018-02-02
  • 淺談vue中文件下載的幾種方式及方法封裝

    淺談vue中文件下載的幾種方式及方法封裝

    本文主要介紹了淺談vue中文件下載的幾種方式及方法封裝,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • vue-video-player視頻播放器使用配置詳解

    vue-video-player視頻播放器使用配置詳解

    這篇文章主要為大家詳細(xì)介紹了vue-video-player視頻播放器的使用和配置,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-10-10

最新評(píng)論

丽江市| 东光县| 衡水市| 灵武市| 阿克陶县| 阜平县| 葵青区| 兴海县| 四川省| 隆尧县| 洪江市| 昌平区| 承德市| 黑河市| 漳平市| 淮阳县| 湖北省| 霍城县| 海丰县| 西藏| 南和县| 寿阳县| 靖州| 壶关县| 永善县| 碌曲县| 阿合奇县| 山阳县| 湘潭市| 肇庆市| 六枝特区| 泉州市| 碌曲县| 柳江县| 兴安盟| 宁明县| 五原县| 济阳县| 阳东县| 米林县| 松滋市|