javascript - ReactJs 保护路由重定向/刷新问题
问题描述
使用react
+ react-router-dom
:
import React from 'react';
import { Switch, Route, Redirect } from 'react-router-dom';
并以此保护路线:
路由器
const Router = () => {
return (
<Switch>
<PrivateRoute exact path='/Panel' component={Panel}></PrivateRoute>
<Route exact path='/Register' component={Register}></Route>
<Route exact path='/Login' component={Login}></Route>
</Switch>
);
};
const PrivateRoute = ({ component: Component, ...rest }) => (
<Route
{...rest}
render={props =>
Auth.getAuth() ? (
<Component {...props} />
) : (
<Redirect
to={{
pathname: "/Login"
}}
/>
)
}
/>
);
认证
const Auth = {
isAuthenticated: false,
authenticate() {
this.isAuthenticated = true;
},
signout() {
this.isAuthenticated = false;
},
getAuth() {
return this.isAuthenticated;
}
};
所以这工作正常,用户可以轻松登录,注销,但问题是当用户登录时我想将用户重定向到/Panel
路由,所以我尝试了:
window.location.href = "/Panel"
或者:
this.props.history.push('/Panel')
两者都重定向到/Login
再次太快,但如果我点击Panel
链接它会Panel
路由。第二个问题是当我刷新这个地址上的页面时,/Panel
它又让我回到了/Login
原点。所以我要解决的是:
- 如何重定向到受保护的路由?
- 在受保护的路由上刷新页面时如何避免重定向?如果我键入此地址并输入它也不起作用。
已经看过这个话题并尝试过但没有成功:
解决方案
对于第一个问题:
您可以将 url 保持在这样的状态,以便登录后您可以重定向到。
<Redirect
to={{
pathname: "/login",
state: { from: props.location }
}}
/>
在登录组件中,成功登录后,您可以重定向到:
const { state } = this.props.location;
window.location = state ? state.from.pathname : "/";
对于第二个问题:
一种替代解决方案是将登录状态保留在 localStorage 中,以便在刷新后应用程序可以从那里读取。这通常是从登录 api 发送一个 jsonwebtoken 到客户端,并将令牌保存到 localStorage。
推荐阅读
- java - MapStruct 不同的实现:mvn install vs run
- scala - 在本地运行 Spark 应用程序会导致网络错误
- java - 使用 ManyToOne 进行 Spring Data JPA 投影
- python - 使用 PIL 处理时,AWS S3 存储桶图像会旋转。如何解决方向变化?
- excel - 如何为打开时删除/重新创建的工作表存储 PT 更新事件?
- python-3.x - 这里有什么问题?为什么它不应该显示类型错误?
- swift - 为什么我在尝试仅在 tvOS 目标上使用 Apple 登录时收到错误 7014
- mysql - 如何在mysql中将列转换为数组?
- java - 使用 Java Lambda 表达式并行查询 DynamoDb GSI
- c# - 如何在我的控制台和 wpf 应用程序之间使用非对称加密?