【发布时间】:2021-05-12 11:51:12
【问题描述】:
我有一个访问 Flask API 的 React 应用程序。要访问某些 API 路由,用户需要登录。我正在使用 Axios 来执行请求。然后,他收到一个存储在本地存储中的令牌。当这个令牌过期并且用户发出另一个请求时,我想将他重定向到登录页面。但是,我不知道该怎么做。
我正在使用 Axios 响应拦截器处理 API 请求错误。它从本地存储中删除令牌,然后应该将用户重定向到登录页面。由于我使用的是功能组件,我找不到合适的示例(除了下载另一个名为 history 的包)。
我尝试使用 'useHistory' 钩子并从 react-router-dom 重定向(使用正确的 BrowserRouter 设置),但它不起作用。
api.js
import axios from "axios"
import { RemoveAuth } from "./Auth"
export const api = axios.create({
baseURL: "http://localhost:5000/api/",
timeout: 15000,
})
// more code
api.interceptors.response.use(null, (error) => {
if(error.response.status === 401){
RemoveAuth();
}
return error;
});
Auth.js
import { useHistory } from "react-router-dom"
export const RemoveAuth = () => {
let history = useHistory()
localStorage.clear();
history.push('/login')
}
routes.js
import React from "react";
import { BrowserRouter, Switch, Route } from "react-router-dom";
import PrivateRoutes from "./PrivateRoutes";
import Dashboard from "../pages/dashboard";
import Login from "../pages/login";
import Logout from "../pages/logout";
const Routes = () => (
<BrowserRouter>
<Switch>
<PrivateRoutes exact path="/dashboard" component={Dashboard} />
<PrivateRoutes exact path="/logout" component={Logout} />
<Route exact path="/login" component={Login} />
</Switch>
</BrowserRouter>
);
PrivateRoutes.js
import React from "react";
import { Route, Redirect } from "react-router-dom";
import { AuthLogin } from "../services/Auth";
const PrivateRoutes = ({ component: Component, ...rest }) => (
<Route
{...rest}
render={() => (AuthLogin() ? <Redirect to="/login" /> : <Component />)}
/>
);
export default PrivateRoutes;
提前感谢您的帮助!
【问题讨论】:
-
我认为你只能在反应组件中使用'useHistory'。在 Auth.js 中,您可以通过“window.location.reload()”来处理它。之后在 PrivateRoute 中自动检测并重定向到 /login
-
@navand 这完美!这是一个比安装另一个软件包简单得多的解决方案。它会增加代码的复杂性。这样做有什么缺点吗?
-
另一种方式,你应该从调用 api 的反应组件中处理它。
-
是的,没有其他办法了,对吧?如果您想用您在第一条评论中所说的话写一个答案,我很乐意将其标记为正确答案!
-
注意,
window.location.reload会导致整个页面刷新。这就像在浏览器中点击刷新按钮一样。与react-router解决方案非常不同。
标签: javascript reactjs axios react-router-dom