nodejs+express重定向

前言:

本篇代码中需要安装的依赖包包括:requestexpress

1.常用重定向方法

nodejs中的重定向可以使用.redirect()方法,该方法中可以传两个参数:code和path,code指重定向时,当前访问的这个接口的返回码301或302,为非必选参数;path指重定向的地址,必填参数。一般情况下,可以不指定code码直接重定向,这时,重定向的响应码默认为302。所以,重定向可以有两种写法:res.redirect(code, path)res.redirect(path)

2.前端伪造重定向

在实际使用中经常会遇到一些不可预知的状况。如本次文中在重定向时就遇到了这样的情况:nodejs在后台触发重定向到某个地址,浏览器会自动对这个url做一次options校验,options请求返回了403导致流程终止。这就导致我们的重定向无法完成。

针对这种情况,我们想了另外一种方式:那就是,后端在判断到需要重定向后,返回一个能够识别的响应,让前端来做跳转。具体的流程为:

  • 后端封装用于识别重定向的响应
  • 前端获取到结果,伪造重定向

实现方法为:

  1. 后端封装重定向响应
javascript 复制代码
request.get(`request-url`, function(error, response, body) {
    if(!error && response.statusCode === 200) {
        next()
    } else if(response.statusCode === 401) {
        const data = {
            "code": 401,
            "authUrl": url,
            "status": "redirect"
        }
        res.send(data)
    }
})

request-url是一个判断用户是否有权限的接口。在本示例中,如果该接口的响应没有报错且响应的状态码是200,那么,express执行next中间件(next是从上一个方法中传入的);如果状态码不是200(401是request-url接口给出的错误状态码,调用不同接口需求确定该状态码为多少),会封装一个data对象,通过res.send(data)响应给浏览器。

在data对象中,code是状态码,status是状态标识,前端通过code和status一起进行判断是否重定向。url是重定向的地址

  1. 前端伪造重定向
javascript 复制代码
if (code === 401) {
  letdata = res.data
  if(data.status === 'redirect') {
    window.location.href = data.authUrl
    return
  }
}

可以看到,前端伪造重定向的依据是:code等于401且status为redirect。制造重定向的方法是使用window.location.href方法。这样,当访问到某个接口发现不满足条件时,就可以自动跳转到指定地址,完成了重定向。

3.特别情况说明

在本例中,重定向的是一个页面的地址,一个站点资源,如https://xxx/#/index的格式。

PS :注意/#/index,这是前端路由经典的webHash模式。

我们拼接的重定向跳转地址是:https://aaa.com?params=params&redirect_url=https://xxx/#/index,定义为redirectUrl。

可以看到,我们将redirect_url=https://xxx/#/index拼接到了https://aaa.com?params=params的后面。

出现的问题是:当我们通过浏览器window.location.href跳转时,浏览器地址栏中出现的是如下图所示的地址,#/index后缀丢失了:

出现这种问题的结果是什么呢?

在vue框架中,我们通过to.query获取不到?后面的参数,导致后续的一些工作无法开展。

怎么解决呢?

使用encodeURIComponent,将路径进行编码,访问就正常了。如本例中,我们在拼接redirect_url=https://xxx/#/index后的https://xxx/#/index时,以这种方式操作:

javascript 复制代码
let url = "https://xxx/#/index"
let redirectUrl = encodeURIComponent(url )

这样一操作,在浏览器了就可以正常访问了。一些实现正常~

相关推荐
一水1 天前
TTFT优化:一个方案的5次推倒重来
java·ai·状态模式
米码收割机2 天前
SA508-3钢回火焊道焊接温度场数值模拟(模拟图+论文)
spring boot·express·宠物
yz_aiks3 天前
Requestly规则使用技巧:前端联调、接口Mock与网络请求调试实战
前端·网络·状态模式·requestly
星恒随风3 天前
C++ STL 详解:map 与 multimap 的使用、operator[]
开发语言·c++·笔记·学习·状态模式
Pu_Nine_93 天前
Vue3+TS+Express 转 Nuxt4 全栈开发笔记(Drizzle ORM + MySQL)
前端·vue·express·nuxt.js·全栈框架
Dontla3 天前
q搜索 / q过滤解释(q参数、query参数、q=)
状态模式
冰箱上的笑话6 天前
从 CORS 报错到两套方案选型:一份能直接抄的跨域复盘
状态模式·安全性测试·跨域
张人玉7 天前
基于 Vue 3 + ECharts + Express + SQLite 构—— LDA 模型的新闻舆论主题识别与情感分析系统
vue.js·echarts·express
凤山老林7 天前
从美团全栈化看 AI 冲击:前端转全栈,是自救还是必然
前端·人工智能·状态模式
码云数智-大飞7 天前
前后端沟通总吵架,一套高效协作规范分享
状态模式