当前位置:首页 > React

React如何保持登录状态

2026-01-24 12:32:02React

使用本地存储(localStorage/sessionStorage)

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

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

// 应用初始化时检查token
const token = localStorage.getItem('authToken');
if (token) {
  // 验证token有效性,更新应用状态
}

使用Context API管理全局状态

通过React的Context API共享登录状态,避免逐层传递props。结合useReduceruseState管理用户认证状态。

// 创建AuthContext
const AuthContext = createContext();

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

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

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

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

// 在组件中使用
const { user, login, logout } = useContext(AuthContext);

使用HTTP Only Cookie

后端设置HttpOnly Cookie存储token,防止XSS攻击窃取。前端每次请求自动携带Cookie,无需手动处理存储。

// 后端示例(Node.js/Express)
res.cookie('authToken', 'your_token_here', {
  httpOnly: true,
  secure: true, // 仅HTTPS
  maxAge: 86400000 // 过期时间
});

定时刷新Token

为避免token过期导致用户被迫重新登录,实现静默刷新机制。在token临近过期时,使用refresh token获取新token。

// 检查token过期时间并刷新
function checkTokenExpiry() {
  const token = localStorage.getItem('authToken');
  if (isTokenExpiringSoon(token)) {
    fetch('/api/refresh-token', {
      method: 'POST',
      credentials: 'include'
    }).then(res => res.json())
      .then(data => localStorage.setItem('authToken', data.newToken));
  }
}

// 定时检查(如每小时一次)
setInterval(checkTokenExpiry, 3600000);

路由守卫(Protected Routes)

通过高阶组件或自定义钩子限制未登录用户访问特定路由,自动跳转到登录页。

function PrivateRoute({ component: Component, ...rest }) {
  const { user } = useContext(AuthContext);
  return (
    <Route
      {...rest}
      render={props =>
        user ? <Component {...props} /> : <Redirect to="/login" />
      }
    />
  );
}

服务端渲染(SSR)兼容

在Next.js等框架中,结合getServerSideProps或中间件验证服务端登录状态,确保首屏渲染时已同步认证状态。

// Next.js示例
export async function getServerSideProps(context) {
  const { req } = context;
  const token = req.cookies.authToken;
  if (!token) {
    return { redirect: { destination: '/login' } };
  }
  return { props: { user: await verifyToken(token) } };
}

React如何保持登录状态

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

相关文章

vue实现订单状态

vue实现订单状态

Vue 实现订单状态管理 在 Vue 中实现订单状态管理通常涉及状态展示、状态流转和交互逻辑。以下是具体实现方法: 状态数据定义 在 Vue 组件的 data 或 Vuex 的 state 中定义订…

简单vue状态管理实现

简单vue状态管理实现

Vue 状态管理实现方法 使用 Vue 的响应式系统 Vue 的响应式系统可以轻松实现简单的状态管理。通过创建一个响应式对象,可以在多个组件之间共享状态。 // store.js import {…

React如何获取li

React如何获取li

获取单个 <li> 元素 在 React 中,可以通过 ref 直接获取 DOM 元素。使用 useRef 钩子创建引用,并将其绑定到目标 <li> 元素上。 import…

react如何状态管理

react如何状态管理

React 状态管理方法 React 提供了多种状态管理方案,适用于不同规模的应用程序需求。以下是常见的几种方式: 内置状态管理(useState/useReducer) useState 适…

React如何创建store

React如何创建store

创建 Redux Store 的基本步骤 安装 Redux 和 React-Redux 依赖包: npm install redux react-redux 创建 reducer 函数管理状态:…

React如何阻断render刷新

React如何阻断render刷新

使用 shouldComponentUpdate 生命周期方法 在类组件中,可以通过实现 shouldComponentUpdate 方法来控制组件是否需要重新渲染。该方法接收 nextProps 和…