You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React页面刷新后会话丢失问题求助

问题原因

你的代码仅通过storage事件触发登录状态检查,但该事件仅在其他浏览器标签页修改sessionStorage时才会触发,当前页面刷新时并不会触发这个事件。因此页面刷新后,组件挂载阶段没有主动读取sessionStorage中的token,导致isAuthenticated维持初始值,出现会话状态丢失的问题。

快速修复方案

修改useEffect,在组件挂载时主动执行一次状态检查,同时保留跨标签页的storage事件监听:

useEffect(() => {
  const checkAuthToken = () => {
    const token = sessionStorage.getItem('auth-token');
    setIsAuthenticated(!!token); // 简化布尔值判断逻辑
  };

  // 组件挂载时立即执行一次检查
  checkAuthToken();

  window.addEventListener('storage', checkAuthToken);

  return () => {
    window.removeEventListener('storage', checkAuthToken);
  };
}, []);
推荐的Firebase原生实现方式

既然基于Firebase开发,更可靠的方式是使用Firebase Auth官方提供的onAuthStateChanged监听,它会自动处理页面刷新、token过期、用户登录/登出等场景,无需手动管理sessionStorage:

import { getAuth, onAuthStateChanged } from "firebase/auth";

useEffect(() => {
  const auth = getAuth();
  // 订阅认证状态变化
  const unsubscribe = onAuthStateChanged(auth, (user) => {
    setIsAuthenticated(!!user);
    // 若仍需将token存入sessionStorage,可在此处获取:
    // if (user) {
    //   user.getIdToken().then(token => sessionStorage.setItem('auth-token', token));
    // } else {
    //   sessionStorage.removeItem('auth-token');
    // }
  });

  // 组件卸载时取消订阅
  return unsubscribe;
}, []);

内容的提问来源于stack exchange,提问作者Ugurcan Kaya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 01:45:32