当前位置:首页 > 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或中间件验证服务端登录状态,确保首屏渲染时已同步认证状态。

React如何保持登录状态

// 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
分享给朋友:

相关文章

vue实现单选状态

vue实现单选状态

实现单选状态的方法 在Vue中实现单选状态通常可以通过以下几种方式完成,具体取决于使用场景和需求。 使用v-model绑定单选按钮 通过v-model可以轻松实现单选按钮的选择状态绑定。将同一组单选…

react如何控制loading状态

react如何控制loading状态

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

React如何刷新当前组件

React如何刷新当前组件

强制刷新当前组件 使用forceUpdate方法可以强制React组件重新渲染,即使状态或属性未发生变化。这种方法应谨慎使用,通常仅在直接修改了类组件的实例属性时使用。 this.forceUpda…

React如何访问子组件dom

React如何访问子组件dom

使用 ref 和 React.forwardRef 父组件通过 ref 直接访问子组件的 DOM 节点。子组件需要使用 React.forwardRef 将 ref 转发到内部的 DOM 元素。…

React如何点击以后再渲染组件

React如何点击以后再渲染组件

条件渲染实现点击后渲染组件 在React中实现点击后再渲染组件,可以通过状态管理控制组件的渲染条件。核心思路是利用useState钩子存储一个布尔值,通过点击事件切换该状态。 import…

react如何清除全部勾选状态

react如何清除全部勾选状态

清除全部勾选状态的方法 在React中,清除全部勾选状态通常涉及管理组件的状态(state)或使用受控组件。以下是几种常见场景的解决方案: 使用受控组件管理勾选状态 通过维护一个状态变量来跟踪勾选状…