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

前端檢測(cè)用戶登錄狀態(tài)是否過(guò)期的幾種方法

 更新時(shí)間:2024年11月26日 09:03:53   作者:Luckyfif  
這篇文章主要介紹了在前端開(kāi)發(fā)中判斷用戶登錄狀態(tài)是否過(guò)期的方法,包括檢查令牌有效期、定時(shí)輪詢服務(wù)器、全局請(qǐng)求攔截器和利用Web存儲(chǔ)中的時(shí)間戳,文章還討論了在特定場(chǎng)景下如何實(shí)現(xiàn)優(yōu)雅降級(jí),以避免中斷用戶操作,需要的朋友可以參考下

在前端開(kāi)發(fā)中 , 判斷用戶登錄狀態(tài)是否過(guò)期是一個(gè)常見(jiàn)的需求。尤其是在復(fù)雜的場(chǎng)景中 , 準(zhǔn)確判斷用戶登錄狀態(tài)是否過(guò)期是保障用戶體驗(yàn)的關(guān)鍵環(huán)節(jié)。這一過(guò)程涉及到服務(wù)器與前端之間的緊密協(xié)作 , 以及多種技術(shù)手段的綜合運(yùn)用 , 還是蠻有挑戰(zhàn)性的。

判斷登錄過(guò)期的主要方法有: 檢查令牌有效期 , 定時(shí)輪詢服務(wù)器 , 全局請(qǐng)求攔截器 , 利用web存儲(chǔ)中的時(shí)間戳

一、檢查令牌有效期

對(duì)于包含有效期信息的令牌(如 JWT 中的exp字段),前端可以在每次發(fā)送請(qǐng)求之前對(duì)令牌進(jìn)行檢查。以下是一個(gè)簡(jiǎn)單的檢查 JWT 令牌有效期的函數(shù)示例(使用jwt-decode庫(kù)來(lái)解析 JWT):

import jwt_decode from 'jwt-decode';

function checkTokenValidity(token) {
    try {
        const decodedToken = jwt_decode(token);
        const currentTime = Date.now() / 1000; // 獲取當(dāng)前時(shí)間(以秒為單位)
        if (decodedToken.exp < currentTime) {
            console.log('令牌已過(guò)期(令牌有效期檢查)');
            return false;
        }
        return true;
    } catch (error) {
        console.log('令牌解析出錯(cuò):', error);
        return false;
    }
}

// 在發(fā)送請(qǐng)求前調(diào)用此函數(shù)檢查令牌
const token = localStorage.getItem('token');
if (checkTokenValidity(token)) {
    // 令牌有效,繼續(xù)發(fā)送請(qǐng)求
    // 這里假設(shè)使用`axios`發(fā)送請(qǐng)求
    axios.get('/api/data');
} else {
    console.log('登錄狀態(tài)可能已過(guò)期,需處理');
    // 處理登錄過(guò)期情況,如提示用戶重新登錄
}

二、定時(shí)輪詢服務(wù)器

輪詢服務(wù)器狀態(tài)是一種主動(dòng)檢查令牌是否有效的方法。前端可以定期發(fā)送請(qǐng)求到服務(wù)器,檢查令牌是否仍然有效。

1. 定時(shí)輪詢

設(shè)置一個(gè)定時(shí)器,每隔一定時(shí)間發(fā)送請(qǐng)求到服務(wù)器,檢查令牌狀態(tài):

function checkTokenStatus() {
    axios.get('/auth/check')
        .then(response => {
            if (!response.data.valid) {
                // 令牌無(wú)效,執(zhí)行登出邏輯
                logout();
            }
        })
        .catch(error => {
            // 網(wǎng)絡(luò)錯(cuò)誤或其他問(wèn)題,執(zhí)行登出邏輯
            logout();
        });
}
setInterval(checkTokenStatus, 15 * 60 * 1000); // 每15分鐘檢查一次

2.優(yōu)化輪詢頻率

需求背景: 在企業(yè)級(jí)應(yīng)用中,可能會(huì)有大量用戶同時(shí)在線,頻繁的過(guò)期檢測(cè)操作(如定時(shí)輪詢)會(huì)對(duì)系統(tǒng)性能造成過(guò)大的負(fù)擔(dān)。因此,需要采用高效的過(guò)期檢測(cè)機(jī)制,例如優(yōu)化輪詢的頻率,或者采用更智能的令牌有效期檢查算法,減少不必要的檢測(cè)次數(shù)。

為了減少對(duì)服務(wù)器的壓力,可以根據(jù)用戶的操作頻率調(diào)整輪詢頻率。例如,在用戶活躍時(shí)頻繁檢查,在用戶長(zhǎng)時(shí)間沒(méi)有操作時(shí)減少檢查頻率。

let lastActivityTime = Date.now();
document.addEventListener('mousemove', () => lastActivityTime = Date.now());
document.addEventListener('keydown', () => lastActivityTime = Date.now());

setInterval(() => {
    if (Date.now() - lastActivityTime < 5 * 60 * 1000) { // 用戶5分鐘內(nèi)有操作
        checkTokenStatus();
    }
}, 15 * 60 * 1000);

這種方法可以在確保安全性的同時(shí)減少對(duì)服務(wù)器的壓力。

三、全局請(qǐng)求攔截器

前端在發(fā)送請(qǐng)求時(shí),可以通過(guò)檢查服務(wù)器的響應(yīng)狀態(tài)碼來(lái)判斷登錄是否過(guò)期。通常,服務(wù)器會(huì)返回401未授權(quán)狀態(tài)碼表示令牌無(wú)效或過(guò)期。

1. 捕獲401狀態(tài)碼

axios.interceptors.response.use(response => {
    return response;
}, error => {
    if (error.response.status === 401) {
        // 令牌無(wú)效或過(guò)期,執(zhí)行登出邏輯
        logout();
    }
    return Promise.reject(error);
});

2.彈出登錄提示

當(dāng)捕獲到401狀態(tài)碼時(shí) , 可以彈出登錄提示 , 引導(dǎo)用戶重新登錄:

function logout() {
    // 清除本地存儲(chǔ)的令牌
    removeToken();
    // 彈出登錄提示
    alert('登錄已過(guò)期,請(qǐng)重新登錄');
    // 跳轉(zhuǎn)到登錄頁(yè)面
    window.location.href = '/login';
}

這種方法可以確保前端在令牌過(guò)期時(shí)及時(shí)響應(yīng),提高了系統(tǒng)的安全性。

四、利用web中的持久化存儲(chǔ)

前端可以在登錄成功時(shí)將令牌的有效期時(shí)間戳保存到Web存儲(chǔ)(如localStorage或sessionStorage),并在每次請(qǐng)求前檢查時(shí)間戳是否過(guò)期。

1.保存時(shí)間戳

在用戶登錄成功后 , 將令牌和有效期時(shí)間戳保存到 localStorage中:

function saveToken(token, expiresIn) {
    const expirationTime = Date.now() + expiresIn * 1000;
    localStorage.setItem('token', token);
    localStorage.setItem('tokenExpiration', expirationTime);
}

2.檢查時(shí)間戳

在每次請(qǐng)求前,檢查當(dāng)前時(shí)間是否超過(guò)保存的時(shí)間戳:

function isTokenExpired() {
    const expirationTime = localStorage.getItem('tokenExpiration');
    return Date.now() >= expirationTime;
}

如果時(shí)間戳過(guò)期,則提示用戶重新登錄:

axios.interceptors.request.use(config => {
    if (isTokenExpired()) {
        // 令牌過(guò)期,執(zhí)行登出邏輯
        logout();
    } else {
        const token = localStorage.getItem('token');
        config.headers['Authorization'] = `Bearer ${token}`;
    }
    return config;
}, error => {
    return Promise.reject(error);
});

特定場(chǎng)景中的優(yōu)化方案

前面都是檢測(cè)用戶登錄狀態(tài)的方法 , 這個(gè)時(shí)候 產(chǎn)品經(jīng)理提出一個(gè)需要優(yōu)化的點(diǎn):

需求背景: 在業(yè)務(wù)流程中,用戶可能正在進(jìn)行重要的操作(如填寫復(fù)雜的表單、進(jìn)行數(shù)據(jù)分析等)。當(dāng)?shù)卿洜顟B(tài)過(guò)期時(shí),應(yīng)盡量避免突然中斷用戶操作,如在不影響用戶當(dāng)前輸入的情況下彈出提示框,引導(dǎo)用戶重新登錄。

那我們?nèi)绾螌?shí)現(xiàn)這個(gè)需求呢? 答案是--------優(yōu)雅降級(jí)

當(dāng)檢測(cè)到登錄狀態(tài)過(guò)期時(shí),為了避免給用戶帶來(lái)突兀的體驗(yàn),我們需要采用優(yōu)雅降級(jí)的方式。例如,可以通過(guò)模態(tài)框提示用戶登錄過(guò)期信息,并允許用戶重新登錄,同時(shí)要保留當(dāng)前頁(yè)面的狀態(tài)。以下是一個(gè)使用 React.js 實(shí)現(xiàn)的簡(jiǎn)單示例(使用react-bootstrap的模態(tài)框組件):

首先,確保項(xiàng)目中已經(jīng)安裝了react-bootstrapreact-router-dom庫(kù)。

import React, { useState } from 'react';
import { Button, Modal } from 'react-bootstrap';
import { useHistory } from 'react-router-dom';

const LoginExpiredModal = () => {
    const [dialogVisible, setDialogVisible] = useState(false);
    const history = useHistory();
    // 這里模擬存儲(chǔ)當(dāng)前頁(yè)面的一些狀態(tài)信息,比如表單數(shù)據(jù)等
    const currentPageState = {
        formData: { name: 'John', age: 30 }
    };

    const showModal = () => {
        setDialogVisible(true);
    };

    const handleClose = () => {
        // 將當(dāng)前頁(yè)面狀態(tài)存儲(chǔ)到localStorage中
        localStorage.setItem('pageState', JSON.stringify(currentPageState));
        // 重定向到登錄頁(yè)面
        history.push('/login');
    };

    return (
        <div>
            <Button onClick={showModal}>模擬觸發(fā)登錄過(guò)期提示</Button>
            <Modal show={dialogVisible} onHide={handleClose}>
                <Modal.Header closeButton>
                    <Modal.Title>登錄過(guò)期</Modal.Title>
                </Modal.Header>
                <Modal.Body>
                    <p>您的登錄已過(guò)期,請(qǐng)重新登錄。</p>
                </Modal.Body>
            </Modal>
        </div>
    );
};

export default LoginExpiredModal;

總結(jié) 

到此這篇關(guān)于前端檢測(cè)用戶登錄狀態(tài)是否過(guò)期的文章就介紹到這了,更多相關(guān)前端檢測(cè)用戶登錄狀態(tài)過(guò)期內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • javascript 關(guān)于賦值、淺拷貝、深拷貝的個(gè)人理解

    javascript 關(guān)于賦值、淺拷貝、深拷貝的個(gè)人理解

    關(guān)于賦值、淺拷貝、深拷貝,以前也思考良久,很多時(shí)候都以為記住了,但是,我太難了。今天我特地寫下筆記,希望可以完全掌握這個(gè)東西,也希望可以幫助到任何想對(duì)學(xué)習(xí)這個(gè)東西的同學(xué)
    2019-11-11
  • javascrit中undefined和null的區(qū)別詳解

    javascrit中undefined和null的區(qū)別詳解

    這篇文章主要介紹了javascrit中undefined和null的區(qū)別詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-04-04
  • JS this關(guān)鍵字在ajax中使用出現(xiàn)問(wèn)題解決方案

    JS this關(guān)鍵字在ajax中使用出現(xiàn)問(wèn)題解決方案

    這篇文章主要介紹了JS this關(guān)鍵字在ajax中使用出現(xiàn)問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • JS實(shí)現(xiàn)很酷的水波文字特效實(shí)例

    JS實(shí)現(xiàn)很酷的水波文字特效實(shí)例

    這篇文章主要介紹了JS實(shí)現(xiàn)很酷的水波文字特效,實(shí)例分析了javascript操作圖層特效的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Bootstrap table兩種分頁(yè)示例

    Bootstrap table兩種分頁(yè)示例

    這篇文章主要為大家詳細(xì)介紹了Bootstrap table兩種分頁(yè)示例,服務(wù)器端分頁(yè)和客戶端分頁(yè),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • layui中的switch開(kāi)關(guān)實(shí)現(xiàn)方法

    layui中的switch開(kāi)關(guān)實(shí)現(xiàn)方法

    今天小編就為大家分享一篇layui中的switch開(kāi)關(guān)實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-09-09
  • 用javascript關(guān)閉本窗口技巧小結(jié)

    用javascript關(guān)閉本窗口技巧小結(jié)

    window.close()是用來(lái)關(guān)閉窗口的,而且ie和firefox都是支持的,下面通過(guò)示例為大家介紹下用javascript關(guān)閉本窗口
    2014-09-09
  • Bootstrap 中下拉菜單修改成鼠標(biāo)懸停直接顯示

    Bootstrap 中下拉菜單修改成鼠標(biāo)懸停直接顯示

    本文介紹將Bootstrap的二級(jí)菜單由點(diǎn)擊顯示改為鼠標(biāo)懸停顯示的具體實(shí)現(xiàn)方法,希望對(duì)大家有所幫助。
    2016-04-04
  • 使用微信小程序制作核酸檢測(cè)點(diǎn)查詢工具

    使用微信小程序制作核酸檢測(cè)點(diǎn)查詢工具

    出門在外,沒(méi)有核酸證明寸步難行,此文將教你如何通過(guò)小程序制作一個(gè)工具幫你在人生地不熟的情況如何迅速找到核酸檢測(cè)點(diǎn),實(shí)現(xiàn)核酸點(diǎn)查詢、地圖導(dǎo)航、撥號(hào)等功能,需要的朋友可以參考下
    2022-10-10
  • extjs4圖表繪制之折線圖實(shí)現(xiàn)方法分析

    extjs4圖表繪制之折線圖實(shí)現(xiàn)方法分析

    這篇文章主要介紹了extjs4圖表繪制之折線圖實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了extjs4繪制折線圖的相關(guān)操作技巧、實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2020-03-03

最新評(píng)論

普定县| 湖州市| 大名县| 华宁县| 五寨县| 西昌市| 双牌县| 金川县| 天柱县| 措勤县| 高密市| 安康市| 藁城市| 元阳县| 出国| 琼中| 巴楚县| 灌阳县| 吴忠市| 古交市| 楚雄市| 肇源县| 长葛市| 萨迦县| 五家渠市| 岗巴县| 澄城县| 澎湖县| 广平县| 柳河县| 进贤县| 西藏| 黎城县| 衡山县| 宝应县| 拉孜县| 新乡市| 台湾省| 二手房| 云阳县| 朝阳县|