当前位置:首页 > React

React如何保持登录状态

2026-03-10 20:53:20React

使用本地存储(LocalStorage/SessionStorage)

将用户登录凭证(如Token)存储在浏览器的localStoragesessionStorage中。localStorage数据持久化,关闭浏览器后仍存在;sessionStorage仅在当前会话有效。

// 登录成功后存储Token
localStorage.setItem('authToken', 'your_jwt_token_here');

// 应用初始化时检查Token
const token = localStorage.getItem('authToken');
if (token) {
  // 存在Token则视为已登录
}

使用Context API管理全局状态

创建全局的AuthContext,包裹整个应用,通过Context传递登录状态和用户信息。

import React, { createContext, useState, useContext } from 'react';

const AuthContext = createContext();

export const AuthProvider = ({ children }) => {
  const [user, setUser] = useState(null);

  const login = (userData, token) => {
    setUser(userData);
    localStorage.setItem('authToken', token);
  };

  const logout = () => {
    setUser(null);
    localStorage.removeItem('authToken');
  };

  return (
    <AuthContext.Provider value={{ user, login, logout }}>
      {children}
    </AuthContext.Provider>
  );
};

export const useAuth = () => useContext(AuthContext);

封装受保护路由

创建高阶组件或自定义Hook,拦截未登录用户访问受限路由。

import { Navigate } from 'react-router-dom';
import { useAuth } from './AuthContext';

const PrivateRoute = ({ children }) => {
  const { user } = useAuth();
  return user ? children : <Navigate to="/login" />;
};

自动刷新Token机制

实现Token过期前的自动刷新,避免频繁要求用户重新登录。

// 在API请求拦截器中检查Token有效期
axios.interceptors.response.use(
  response => response,
  async error => {
    const originalRequest = error.config;
    if (error.response.status === 401 && !originalRequest._retry) {
      originalRequest._retry = true;
      const newToken = await refreshToken();
      localStorage.setItem('authToken', newToken);
      return axios(originalRequest);
    }
    return Promise.reject(error);
  }
);

服务端验证

每次关键请求都需向服务端验证Token有效性,防止本地存储被篡改。

React如何保持登录状态

const verifyToken = async () => {
  try {
    const response = await axios.get('/api/verify', {
      headers: { Authorization: `Bearer ${localStorage.getItem('authToken')}` }
    });
    return response.data.valid;
  } catch (error) {
    return false;
  }
};

标签: 状态React
分享给朋友:

相关文章

vue物流状态实现

vue物流状态实现

实现物流状态的基本思路 物流状态通常涉及多个阶段(如已下单、运输中、已送达等),可通过进度条、时间轴或状态标签展示。Vue中可利用动态数据绑定和条件渲染实现交互式效果。 数据准备 定义物流状态数据模…

react如何维护状态

react如何维护状态

使用 useState Hook 管理简单状态 在函数组件中,useState 是最基础的状态管理方式。它返回一个状态值和一个更新该状态的函数。适用于组件内部的简单状态管理。 import Reac…

react如何控制loading状态

react如何控制loading状态

控制 Loading 状态的方法 在 React 中,可以通过多种方式控制 Loading 状态,以下是几种常见的实现方法: 使用 useState 钩子管理状态 import { useStat…

react如何更新组件状态

react如何更新组件状态

使用 useState Hook 在函数组件中,可以通过 useState Hook 来定义和更新状态。useState 返回一个状态值和一个更新该状态的函数。 import React, { us…

react中如何定义初始状态

react中如何定义初始状态

在 React 中定义初始状态 在 React 中,组件的初始状态可以通过类组件或函数组件(使用 Hooks)两种方式定义。以下是具体方法: 类组件中定义初始状态 在类组件中,通过 construc…

react如何根据状态判断展示

react如何根据状态判断展示

根据状态条件渲染 在React中可以通过状态(state)和条件语句动态控制UI渲染。常见方法包括if/else、三元运算符、逻辑与(&&)运算符等。 function Exampl…