总体概述 一个完善的路由系统应该是这样子的,当链接到的组件是需要登录后才能查看,要能够跳转到登录页,然后登录成功后又跳回来之前想访问的页面。这里主要是用一个权限控制类来定义路由路由信息,同时用redux把登录成功后要访问的路由地址给保存起来,登录成功时看redux里面有没有存地址,如果没有存地址就跳转到默认路由地址。 路由权限控制类 在这个方法里面,通过sessionStorage判断是否登录了,如果没有登录,就保存一下当前想要跳转的路由到redux里面。然后跳转到我们登录页。 import React from 'react' import { Route, Redirect } fr 在React应用中,路由权限控制是一项重要的功能,它确保用户只有在满足特定条件(如登录状态)时才能访问特定的页面。本篇文章将探讨如何利用`react-router-dom`的v4版本结合`redux`实现这样的控制机制。 我们要创建一个权限控制组件`AuthorizedRoute`。这个组件会接收`component`、`location`等属性,并根据`sessionStorage`中的`userName`判断用户是否已登录。如果用户未登录,`AuthorizedRoute`会保存当前请求的路径到`redux`的store中,然后重定向到登录页。代码如下: ```jsx import React from 'react'; import { Route, Redirect } from 'react-router-dom'; import { setLoginRedirectUrl } from '../actions/loginAction'; class AuthorizedRoute extends React.Component { render() { const { component: Component, ...rest } = this.props; const isLogged = sessionStorage.getItem("userName") != null ? true : false; if (!isLogged) { setLoginRedirectUrl(this.props.location.pathname); } return ( <Route {...rest} render={props => { return isLogged ? <Component {...props} /> : <Redirect to="/login" /> }} /> ); } } export default AuthorizedRoute; ``` 接下来,我们需要定义路由信息。这里使用`BrowserRouter`、`Switch`和`Route`组件。对于需要登录才能访问的路由,我们使用`AuthorizedRoute`包裹。例如: ```jsx import React from 'react'; import { BrowserRouter, Switch, Route, Redirect } from 'react-router-dom'; import AuthorizedRoute from './AuthorizedRoute'; // ...其他组件导入 export const Router = () => ( <BrowserRouter> <div> <Switch> <Route path="/login" component={Login} /> <Redirect from="/" exact to="/login" /> {/* 其他已定义好的路由 */} <AuthorizedRoute path="/protected-route" component={ProtectedComponent} /> <Route component={NoFound} /> </Switch> </div> </BrowserRouter> ); ``` 登录页`Login`负责处理用户的登录逻辑。在用户登录成功后,我们需要从`redux`的store中获取之前保存的登录后要跳转的URL,如果没有则跳转到默认页面。可以使用`connect`函数将`redux`的store与组件连接,并在表单提交时处理逻辑: ```jsx import React from 'react'; import { Form, Icon, Input, Button, Checkbox } from 'antd'; import { withRouter, useHistory } from 'react-router-dom'; import { connect } from 'react-redux'; import { login } from '../../mock/mock'; // 假设这是你的登录接口 const FormItem = Form.Item; class NormalLoginForm extends React.Component { constructor(props) { super(props); // ... } handleSubmit = (e) => { e.preventDefault(); this.props.form.validateFields((err, values) => { if (!err) { login(values).then((response) => { if (response.success) { const redirectUrl = this.props.loginRedirectUrl || '/default-page'; this.props.history.push(redirectUrl); } else { // 登录失败处理... } }); } }); }; // ...其他方法和属性 } const mapStateToProps = (state) => ({ loginRedirectUrl: state.login.loginRedirectUrl, // 从store中获取登录后要跳转的URL }); export default withRouter(connect(mapStateToProps)(NormalLoginForm)); ``` 在这个例子中,我们假设`loginAction`中有一个`setLoginRedirectUrl`的action Creator用于将要跳转的URL保存到`redux`的store中,而`login`接口则用于处理实际的登录逻辑。当用户成功登录后,`handleSubmit`函数会从`redux`的store中获取登录后要跳转的URL,并使用`history.push`进行重定向。 总结来说,通过结合`react-router-dom`和`redux`,我们可以创建一个强大的路由权限控制系统,既能防止未授权的访问,也能在用户登录成功后引导他们回到原本尝试访问的页面。这不仅提高了用户体验,也加强了应用的安全性。































- 粉丝: 6
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 毕设&课设:智慧型报告厅——我的毕业设计项目.zip
- 毕设&课设:智慧校园之家长子系统.,计算机毕业设计,毕设,Java毕业设计,SpringBoot,SSM,小程序.zip
- 中国软件杯赛事中的计算机视觉前端框架
- 【自然语言处理】基于中文分词的文本相似度动态规划算法优化:高效准确的论文防抄袭系统设计与实现(论文复现含详细代码及解释)
- 这篇文章详细介绍了针对室内3D物体检测的主动学习框架,旨在解决室内场景下3D物体检测面临的独特挑战,包括样本少、类别多、类别不平衡严重以及场景类型和类内差异大的问题(论文复现含详细代码及解释)
- 【电力电子与控制工程】基于准PR+改进重复控制的光伏逆变器谐波抑制与动态响应优化:复合控制策略的MATLAB仿真及硬件实现(论文复现含详细代码及解释)
- 机器学习与深度学习 Python实现基于PSO-Transformer粒子群优化算法(PSO)优化Transformer编码器进行多特征分类预测的详细项目实例(含完整的程序,GUI设计和代码详解)
- 【神经网络同步与稳定性】几类比例时滞神经网络的同步性和稳定性研究:理论分析、MATLAB代码复现及应用示例(论文复现含详细代码及解释)
- 详细研究了交错并联Buck变换器的工作原理、性能优势及其仿真实现(论文复现含详细代码及解释)
- 相似性搜索及其应用进展
- 深度学习与计算机视觉:从入门到精通之路详解
- 电力电子交错并联双向Buck/Boost集成LLC谐振型三端口直流变换器设计与仿真:新能源微电网高效功率转换系统(论文复现含详细代码及解释)
- 电力电子交错并联型光伏储能双向DC-DC变换器研究:解决电流不均与提高系统稳定性(论文复现含详细代码及解释)
- 变化检测-基于全卷积孪生网络实现的变化检测算法-附项目源码-优质项目源码.zip
- 基于计算机视觉技术的辅助驾驶软件杯项目
- 2019 年度广东工业大学计算机视觉课程作业


