当前位置:首页 > React

react如何统一处理401请求

2026-01-26 10:04:09React

统一处理401请求的方法

在React应用中,401状态码通常表示未授权或会话过期。以下是几种常见的统一处理方式:

使用axios拦截器

配置axios的请求和响应拦截器,全局捕获401错误并跳转登录页:

import axios from 'axios';
import { history } from './history'; // 自定义history对象

axios.interceptors.response.use(
  response => response,
  error => {
    if (error.response.status === 401) {
      localStorage.removeItem('token');
      history.push('/login');
    }
    return Promise.reject(error);
  }
);

封装自定义fetch

创建封装后的请求函数,处理所有请求的401状态:

async function customFetch(url, options) {
  const response = await fetch(url, {
    ...options,
    headers: {
      'Authorization': `Bearer ${localStorage.getItem('token')}`,
      ...options.headers
    }
  });

  if (response.status === 401) {
    window.location.href = '/login';
    throw new Error('Unauthorized');
  }

  return response;
}

使用React Context

创建全局的请求上下文,统一管理认证状态:

const AuthContext = createContext();

function AuthProvider({ children }) {
  const [isAuth, setIsAuth] = useState(false);

  const checkAuth = async () => {
    try {
      const res = await axios.get('/api/check-auth');
      setIsAuth(true);
    } catch (err) {
      if (err.response.status === 401) {
        setIsAuth(false);
        window.location.href = '/login';
      }
    }
  };

  useEffect(() => {
    checkAuth();
  }, []);

  return (
    <AuthContext.Provider value={{ isAuth, checkAuth }}>
      {children}
    </AuthContext.Provider>
  );
}

高阶组件方式

创建HOC包装需要认证的组件:

function withAuth(Component) {
  return function AuthenticatedComponent(props) {
    const [auth, setAuth] = useState(true);

    useEffect(() => {
      axios.get('/api/check-auth')
        .catch(err => {
          if (err.response.status === 401) {
            setAuth(false);
            window.location.href = '/login';
          }
        });
    }, []);

    return auth ? <Component {...props} /> : null;
  };
}

Redux中间件方案

对于使用Redux的应用,可以创建处理401的中间件:

const authMiddleware = store => next => action => {
  if (action.payload && action.payload.status === 401) {
    store.dispatch({ type: 'LOGOUT' });
    window.location.href = '/login';
  }
  return next(action);
};

每种方法各有优缺点,axios拦截器适合大多数场景,Context方案更适合需要全局状态管理的应用,而Redux中间件则适合已使用Redux的项目。根据项目规模和架构选择最合适的方案。

react如何统一处理401请求

标签: react
分享给朋友:

相关文章

react如何测试

react如何测试

React 测试方法 React 应用的测试通常涉及组件测试、集成测试和端到端测试。以下是常用的测试工具和方法: Jest Jest 是 Facebook 开发的 JavaScript 测试框架,…

react如何更新

react如何更新

更新 React 版本的方法 检查当前 React 版本 运行以下命令查看项目中安装的 React 版本: npm list react 更新 React 及相关依赖 通过 npm 或 yar…

react性能如何

react性能如何

React 性能特点 React 通过虚拟 DOM(Virtual DOM)和高效的 diff 算法优化性能。虚拟 DOM 减少了直接操作真实 DOM 的开销,仅在必要时更新变化的部分。React 的…

如何记忆react

如何记忆react

理解核心概念 React的核心概念包括组件、状态(state)、属性(props)、生命周期方法(类组件)和钩子(函数组件)。掌握这些基础概念是记忆React的关键。组件是React应用的构建块,分为…

react如何查

react如何查

React 查询方法 React 提供了多种查询 DOM 元素的方式,以下是几种常见的方法: 使用 ref 通过 useRef 钩子可以获取 DOM 节点的引用,适用于直接操作 DOM 的场景。…

react如何验证

react如何验证

表单验证方法 在React中验证表单数据通常使用以下几种方式: 内置HTML5验证 利用HTML5原生表单验证属性如required、pattern等,结合form.noValidate属性禁用浏…