当前位置:首页 > React

react实现登录拦截

2026-01-27 02:59:13React

实现登录拦截的基本思路

在React中实现登录拦截通常涉及路由守卫和全局状态管理。核心逻辑是检查用户是否已登录,未登录时重定向到登录页面。

使用React Router实现路由拦截

安装必要依赖:

npm install react-router-dom

创建受保护的路由组件:

import { Navigate, Outlet } from 'react-router-dom';

const ProtectedRoute = ({ isAuthenticated }) => {
  return isAuthenticated ? <Outlet /> : <Navigate to="/login" replace />;
};

在路由配置中使用:

react实现登录拦截

import { BrowserRouter, Routes, Route } from 'react-router-dom';

function App() {
  const [isLoggedIn, setIsLoggedIn] = useState(false);

  return (
    <BrowserRouter>
      <Routes>
        <Route element={<ProtectedRoute isAuthenticated={isLoggedIn} />}>
          <Route path="/dashboard" element={<Dashboard />} />
          <Route path="/profile" element={<Profile />} />
        </Route>
        <Route path="/login" element={<Login onLogin={() => setIsLoggedIn(true)} />} />
      </Routes>
    </BrowserRouter>
  );
}

结合Context管理全局状态

创建认证上下文:

const AuthContext = createContext();

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

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

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

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

在应用顶层包裹Provider:

react实现登录拦截

ReactDOM.render(
  <AuthProvider>
    <App />
  </AuthProvider>,
  document.getElementById('root')
);

处理页面刷新后的状态持久化

在应用初始化时检查本地存储:

const AuthProvider = ({ children }) => {
  const [user, setUser] = useState(() => {
    const token = localStorage.getItem('token');
    return token ? { token } : null;
  });

  // ...其他逻辑
};

实现axios请求拦截

设置全局请求拦截器:

import axios from 'axios';

axios.interceptors.request.use(config => {
  const token = localStorage.getItem('token');
  if (token) {
    config.headers.Authorization = `Bearer ${token}`;
  }
  return config;
});

axios.interceptors.response.use(
  response => response,
  error => {
    if (error.response.status === 401) {
      // 处理token过期情况
      localStorage.removeItem('token');
      window.location.href = '/login';
    }
    return Promise.reject(error);
  }
);

完整登录流程示例

登录组件实现:

function Login() {
  const { login } = useContext(AuthContext);
  const navigate = useNavigate();

  const handleSubmit = async (e) => {
    e.preventDefault();
    try {
      const res = await axios.post('/api/login', { /* 登录数据 */ });
      login(res.data.user);
      navigate('/dashboard');
    } catch (error) {
      alert('登录失败');
    }
  };

  return (
    <form onSubmit={handleSubmit}>
      {/* 登录表单 */}
    </form>
  );
}

标签: react
分享给朋友:

相关文章

如何选购react

如何选购react

选购 React 相关产品或服务的建议 React 是一个用于构建用户界面的 JavaScript 库,广泛应用于前端开发。以下是选购 React 相关产品(如课程、书籍、工具、组件库等)的参考方法:…

react如何diff

react如何diff

React Diff 算法原理 React 的 Diff 算法是 Virtual DOM 的核心部分,用于高效更新真实 DOM。其核心思想是通过对比新旧 Virtual DOM 树的差异,最小化 DO…

react如何配置

react如何配置

配置React项目的基本步骤 安装Node.js和npm 确保系统已安装Node.js(包含npm)。可通过命令行检查版本: node -v npm -v 创建React项目 使用官方工具Creat…

react如何使用ueditor

react如何使用ueditor

安装 UEditor 下载 UEditor 的官方版本,解压后将整个文件夹放入项目的 public 目录下。确保可以通过 URL 直接访问 UEditor 的资源文件,例如 public/uedito…

react如何封装router

react如何封装router

封装 React Router 的基本方法 在 React 中封装 Router 通常是为了统一管理路由配置、添加中间件或增强功能。以下是几种常见的封装方式: 基于 react-router-dom…

react thunk 如何使用

react thunk 如何使用

使用 React Thunk 的基本步骤 安装 Redux 和 Redux Thunk 作为依赖项: npm install redux redux-thunk 在 Redux store 配置中应…