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

React純前端模擬實(shí)現(xiàn)登錄鑒權(quán)

 更新時間:2024年04月16日 09:48:18   作者:慕仲卿  
這篇文章主要為大家詳細(xì)介紹了React純前端模擬實(shí)現(xiàn)登錄鑒權(quán)的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

一、目標(biāo)

本文檔旨在闡述前端模擬登錄鑒權(quán)的實(shí)現(xiàn)機(jī)制,該機(jī)制通過前端技術(shù)和 LocalStorage 實(shí)現(xiàn)用戶的登錄狀態(tài)管理,以確保用戶未登錄時無法直接訪問系統(tǒng)的內(nèi)層頁面,并通過定時器更新登錄狀態(tài),以保持用戶的活動會話。

二、鑒權(quán)規(guī)則設(shè)計

2.1 登錄狀態(tài)判斷

系統(tǒng)通過檢查 LocalStorage 中的 isLogin 字段來判斷用戶是否已登錄。若 LocalStorage 中不存在 isLogin 字段,則視為用戶未登錄。

2.2 未登錄重定向

若用戶未登錄,且嘗試直接訪問以下受保護(hù)的頁面:'/FactoryView', '/FactoryView/ServerNumView', '/FactoryView/ServerNumView/DeviceView', '/GlobalView', '/AdminAreaView',系統(tǒng)將會自動將用戶重定向至 '/Login' 頁面。

2.3 登錄狀態(tài)設(shè)置

用戶成功登錄后,系統(tǒng)會在 LocalStorage 中設(shè)置 isLogin 字段,其值為當(dāng)前的時間戳(以毫秒為單位)。

2.4 定時更新登錄狀態(tài)

用戶一旦進(jìn)入受保護(hù)的內(nèi)層頁面,頁面會啟動一個定時器,該定時器每 5 秒鐘更新 LocalStorage 中的 isLogin 字段,將其值設(shè)置為當(dāng)前時間戳。這確保了只要用戶保持在內(nèi)層頁面,其登錄狀態(tài)就會持續(xù)更新。

2.5 會話超時處理

若用戶關(guān)閉了 App 頁面或離開了受保護(hù)的內(nèi)層頁面,定時器將停止工作,isLogin 字段的值將不再更新。當(dāng)用戶再次嘗試訪問受保護(hù)頁面時,系統(tǒng)會檢查 isLogin 中的時間戳與當(dāng)前時間的差異。若差異超過 30 分鐘,則視為會話超時,用戶將被重定向至登錄頁面。反之,若時間差在 30 分鐘以內(nèi),則允許用戶訪問內(nèi)層頁面,并重啟定時器更新 isLogin 字段。

2.6 流程圖

上述規(guī)則可以使用下面的流程圖表示為:

三、Hook代碼實(shí)現(xiàn)

為實(shí)現(xiàn)上述鑒權(quán)邏輯,我們創(chuàng)建了一個自定義 Hook :useIntervalWhenStarted。這個 Hook 用于在組件掛載時啟動一個定時器,該定時器每5秒更新 LocalStorage 中的 isLogin 字段。

3.1 Hook代碼

import { useState, useEffect } from 'react';

const useIntervalWhenStarted = () => {
  useEffect(() => {
    let timer = null;

    timer = setInterval(() => {
      window.localStorage.setItem('isLogin', (+new Date()).toString());
    }, 5 * 1000);

    return () => {
      if (timer) {
        clearInterval(timer);
      }
    };
  }, []);

  return [];
};

export { useIntervalWhenStarted };

3.2 Hook使用方式

在需要實(shí)現(xiàn)登錄鑒權(quán)的內(nèi)層頁面中,引入并使用該 Hook:

import { useIntervalWhenStarted } from "@/hooks";

// ... 頁面組件代碼 ...

useIntervalWhenStarted();

// ... 頁面組件其余代碼 ...

四、在最外層對路由進(jìn)行攔截

下面就以 UMI.js 框架為例,說明如何攔截路由。

根據(jù) UMI.js 的結(jié)構(gòu)特性,所有組件的渲染必定經(jīng)過預(yù)設(shè)的 layout,因此在 layouts/index.tsx 的組件渲染之前對路由進(jìn)行檢測,根據(jù)其是否否和要求進(jìn)行攔截:

import React from 'react';
import store from 'store';
import { ConfigProvider } from 'antd';
import { Outlet } from '@umijs/max';
import { checkIfLogin } from "@/utils/utils";
import Intl from 'react-intl-universal';
import intlzhCN from '@/locales/zh-CN';
import intlenUS from '@/locales/en-US';
import "./index.less";

const locale = {
  'zh-CN': require('antd/lib/locale/zh_CN'),
  'en-US': require('antd/lib/locale/en_US'),
};

const BasicLayout: React.FC<any> = (props) => {
  const { children } = props;
  console.log(props);
  const lang = store.get('umi_locale') || 'zh-CN';
  Intl.init({
    currentLocale: lang,
    locales: {
      'zh-CN': intlzhCN,
      'en-US': intlenUS,
    },
  });

  checkIfLogin();

  return (
    <ConfigProvider componentSize="small" locale={locale[lang].default}>
      {children}
      <Outlet />
    </ConfigProvider>
  );
};

export default BasicLayout;

上面的代碼中 checkIfLogin 就是用來檢測用戶是否具有查看內(nèi)層頁面權(quán)限的,其實(shí)現(xiàn)為:

/**
 * 檢查登錄狀態(tài),如果沒有登錄則強(qiáng)制到登錄頁
 */
export const checkIfLogin = () => {
  const gap = 30 * 60 * 1000;
  const login = window.localStorage.getItem('isLogin');

  const location = useLocation();
  const { pathname } = location;
  if(['/Login','/login'].includes(pathname)) return;
  if(!login) {
    history.push({
      pathname: '/Login',
    })
  } else {
    const timeStamp = parseInt(login);
    const current = +new Date();
    if (current-timeStamp>gap) {
      window.localStorage.removeItem('isLogin');
      history.push({
        pathname: '/Login',
      })
    }
  }
}

五、亮點(diǎn)說明

亮點(diǎn)一:無服務(wù)器端的會話管理

傳統(tǒng)的會話管理通常需要服務(wù)器端的支持,通過服務(wù)器來記錄用戶的登錄狀態(tài)和會話信息。然而,在本鑒權(quán)機(jī)制中,我們采用了前端技術(shù)和 LocalStorage 來實(shí)現(xiàn)會話管理,無需依賴服務(wù)器端。這降低了服務(wù)器的負(fù)載,并提高了應(yīng)用的響應(yīng)速度。

亮點(diǎn)二:自動會話續(xù)期

通過在內(nèi)層頁面設(shè)置定時器,每 5 秒鐘自動更新 LocalStorage 中的 isLogin 字段,實(shí)現(xiàn)了會話的自動續(xù)期。這種方法能夠確保用戶在保持頁面活躍的情況下,其會話始終有效,避免了用戶頻繁登錄的煩惱。

亮點(diǎn)三:靈活的會話超時處理

本機(jī)制通過比較 isLogin 字段中的時間戳與當(dāng)前時間的差異,來判斷會話是否超時。這種方法既靈活又高效,允許系統(tǒng)在用戶離開頁面后的一段時間內(nèi)保持會話有效,同時又能及時識別和處理超時情況,提升了用戶體驗(yàn)和系統(tǒng)安全性。

亮點(diǎn)四:模塊化、可復(fù)用的Hook實(shí)現(xiàn)

通過創(chuàng)建一個自定義的 Hook(useIntervalWhenStarted),我們將鑒權(quán)邏輯封裝成了一個獨(dú)立的、可復(fù)用的模塊。這使得該邏輯可以輕松地集成到任何需要鑒權(quán)的 React 組件中,提高了代碼的復(fù)用性和可維護(hù)性。

六、總結(jié)

通過上述設(shè)計,我們實(shí)現(xiàn)了一個前端模擬的登錄鑒權(quán)機(jī)制。該機(jī)制通過 LocalStorage 和定時器來管理用戶的登錄狀態(tài),確保了未登錄用戶無法直接訪問受保護(hù)的內(nèi)層頁面,并通過定時器持續(xù)更新登錄狀態(tài)以防止會話超時。

到此這篇關(guān)于React純前端模擬實(shí)現(xiàn)登錄鑒權(quán)的文章就介紹到這了,更多相關(guān)React登錄鑒權(quán)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React組件化條件渲染的實(shí)現(xiàn)

    React組件化條件渲染的實(shí)現(xiàn)

    本文主要介紹了React組件化條件渲染的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • React實(shí)現(xiàn)虛擬滾動的三種思路詳解

    React實(shí)現(xiàn)虛擬滾動的三種思路詳解

    在??web??開發(fā)的過程中,或多或少都會遇到大列表渲染的場景,為了解決大列表造成的渲染壓力,便出現(xiàn)了虛擬滾動技術(shù),本文主要介紹虛擬滾動的三種思路,希望對大家有所幫助
    2024-04-04
  • 解決react中useState狀態(tài)異步更新的問題

    解決react中useState狀態(tài)異步更新的問題

    本文主要介紹了react中useState狀態(tài)異步更新的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 40行代碼把Vue3的響應(yīng)式集成進(jìn)React做狀態(tài)管理

    40行代碼把Vue3的響應(yīng)式集成進(jìn)React做狀態(tài)管理

    這篇文章主要介紹了40行代碼把Vue3的響應(yīng)式集成進(jìn)React做狀態(tài)管理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • nodejs和react實(shí)現(xiàn)即時通訊簡易聊天室功能

    nodejs和react實(shí)現(xiàn)即時通訊簡易聊天室功能

    這篇文章主要介紹了nodejs和react實(shí)現(xiàn)即時通訊簡易聊天室功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • React中常用的Hook有哪些

    React中常用的Hook有哪些

    這篇文章主要介紹了react hooks實(shí)現(xiàn)原理,文中給大家介紹了useState dispatch 函數(shù)如何與其使用的 Function Component 進(jìn)行綁定,節(jié)后實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • React函數(shù)組件與類的區(qū)別有哪些

    React函數(shù)組件與類的區(qū)別有哪些

    函數(shù)式組件的基本意義就是,組件實(shí)際上是一個函數(shù),不是類,下面這篇文章主要給大家介紹了關(guān)于React中函數(shù)組件與類的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • react組件中debounce防抖功能失效問題解決辦法

    react組件中debounce防抖功能失效問題解決辦法

    在React組件中,如果使用useState管理searchKey,每次輸入變化都會導(dǎo)致組件重新渲染,從而生成新的debounce函數(shù),導(dǎo)致防抖功能失效,解決方法是使用useRef定義searchKey為非響應(yīng)式數(shù)據(jù),從而維持debounce函數(shù)的穩(wěn)定,確保防抖功能有效,感興趣的朋友跟隨小編一起看看吧
    2024-10-10
  • 使用?React?Hooks?重構(gòu)類組件的示例詳解

    使用?React?Hooks?重構(gòu)類組件的示例詳解

    這篇文章主要介紹了如何使用?React?Hooks?重構(gòu)類組件,本文就來通過一些常見示例看看如何使用 React Hooks 來重構(gòu)類組件,需要的朋友可以參考下
    2022-07-07
  • React?Native?加載H5頁面的實(shí)現(xiàn)方法

    React?Native?加載H5頁面的實(shí)現(xiàn)方法

    這篇文章主要介紹了React?Native?加載H5頁面的實(shí)現(xiàn)方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04

最新評論

临夏县| 韶关市| 丰县| 武宁县| 行唐县| 颍上县| 虞城县| 乐平市| 平度市| 定州市| 公主岭市| 克东县| 嘉义市| 肃北| 苗栗县| 彭水| 五原县| 台北县| 永靖县| 平遥县| 进贤县| 巴南区| 凤翔县| 嵊州市| 崇文区| 临海市| 民和| 济阳县| 板桥市| 会理县| 宁河县| 长宁区| 咸丰县| 鄂尔多斯市| 尼勒克县| 恩施市| 宁陵县| 江永县| 辽宁省| 汾阳市| 辽源市|