umi中登录后重定向至登录前页面的实现方案

简介: 日常开发中,经常会遇到这种情况:某个页面是从别的链接直接跳转的,未经登录页面的登录操作;这个时候就需要跳转至登录页进行登录获取用户信息,然后再跳转到之前的页面继续进行操作。

此方案为在钉钉微应用中通过钉钉免登操作实现登录,如果有自己的登录方案,则可以进行适当改进;框架使用的是umi,react-router也适用


1. 场景

日常开发中,经常会遇到这种情况:某个页面是从别的链接直接跳转的,未经登录页面的登录操作;这个时候就需要跳转至登录页进行登录获取用户信息,然后再跳转到之前的页面继续进行操作。


2. 实现思路


![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ccf79ddcd34747caaa2ac14d78d5337b~tplv-k3u1fbpfcp-zoom-1.image)


3. 实现方案


1. 跳转登录前的页面配置


这里是在最外层的 `layout.jsx` 组件中监听保存在 dva 中的用户信息/token信息,如果为空,则重定向至 `'/'` 目录下(如果有登录页,可以重定向至登录页):


// BaseLayout.tsx/** * 监听用户信息,为空时,重新进行免登操作,用于点击通知直接进入审批页面 * 为路由添加 from 参数,以便于在登录后能再次进入登录前的页面 */useEffect(() => {
if (JSON.stringify(common.userData) ==='{}') {
history.replace({
pathname: '/',
query,
state: {
from: pathname, // 关键点:携带当前页面路径信息      },
    });
  }
}, [common.userData]);



2. 登录页面配置


'/'  路径下,进入 `pages/index.jsx` 会执行 login 动作,执行钉钉的免登操作,这样就会在登录之后,跳转至登录前的页面:


// index.tsx...const [loggingIn, setLoggingIn] =useState(true);
const [redirectInfo, setRedirectInfo] =useState({
pathname: '/business-approve',
query: {},
  });
useEffect(() => {
// 免登操作:获取用户信息,token信息ready(() => {
// 获取免登授权码runtime.permission.requestAuthCode({
corpId:
process.env.NODE_ENV==='production'?'ding10a015c6f52fb517a39a90f97fcb1e09'          : 'ding10a015c6f52fb517a39a90f97fcb1e09', // 企业idonSuccess({ code }) {
// 获取用户信息getUserInfoAndToken({ code }).then(res=> {
const { code, data } =res;
if (`${code}`==='200'&&data) {
const {
userInfo: { userId },
            } =data;
// 关键点:如果 location 包含 state 则为登录后需要重定向,设置重定向信息,使用 Redirect 重定向if (location?.state) {
const { query, state } =location?.state|| {};
setRedirectInfo({
pathname: state?.from??'/business-approve',
query,
              });
            }
setLoggingIn(false);
          }
        });
      },
    });
  });
}, [location]);
...returnloggingIn?null : <Redirectto={{ ...redirectInfo }} />;


目录
相关文章
|
前端开发 开发者
Umi 4 特性 02:React Router 6 和新路由
Umi 4 特性 02:React Router 6 和新路由
1417 0
|
Web App开发 编解码 前端开发
webgl canvas系列——快速加背景、抠图、加水印并下载图片
webgl canvas系列——快速加背景、抠图、加水印并下载图片
580 8
webgl canvas系列——快速加背景、抠图、加水印并下载图片
uniApp获取当前位置经纬度
uniApp获取当前位置经纬度
821 0
|
资源调度
umi中AssertionError [ERR_ASSERTION]: filePath not found of
umi中AssertionError [ERR_ASSERTION]: filePath not found of
|
存储 Web App开发 JSON
存储界的cookie、本地存储、会话存储
存储界的cookie、本地存储、会话存储
593 0
|
缓存 JavaScript 前端开发
理解回流跟重绘
【10月更文挑战第24天】回流和重绘是网页渲染过程中的重要概念,它们相互关联又各自具有不同的特点和影响。通过深入了解它们,我们可以更好地掌握页面性能优化的关键,为用户提供更加优质的浏览体验。
|
开发框架 JavaScript 搜索推荐
我的博客网站为什么又回归Blazor了
码界工坊(https://dotnet9.com)是一个使用 .NET 9 Blazor 开发的博客网站,经过多次技术迭代,最终采用静态 SSR 和 Ant Design 设计风格。网站包含技术文章、开源项目介绍和在线工具,源码已开源(https://github.com/dotnet9/CodeWF)。感谢 Known、AntBlazor 和社区的贡献。
|
NoSQL Shell MongoDB
Mac OSX 平台安装 MongoDB
10月更文挑战第11天
289 4
|
SQL XML Java
Mybatis的原理和MybaitsPlus
这篇文章对比分析了Mybatis和Mybatis Plus的特点与底层实现机制,探讨了两者之间的差异及各自的优势。
386 0