已设置Session Storage的redirectUrl,后端登录接口无法获取该值
问题根源
sessionStorage是浏览器端的本地存储,后端Node.js完全无法直接读取它的内容,所以你用request.body.redirectUrl或request.session.redirectUrl肯定拿不到值。
解决方案:把跳转路径通过查询参数传递并提交
步骤1:修改products.ejs的跳转逻辑,携带redirectUrl到登录页
把跳转/login的代码改成带查询参数的形式,用encodeURIComponent处理URL避免编码问题:
// products.ejs中的脚本修改部分 if (loggedInData === 'false') { event.preventDefault(); const currentPageUrl = window.location.href; // 带查询参数跳转到登录页 window.location.href = `/login?redirectUrl=${encodeURIComponent(currentPageUrl)}`; }
步骤2:在login.ejs的登录表单中添加隐藏字段,传递redirectUrl
在登录表单里加入一个隐藏输入框,把URL参数存进去,这样POST请求时会把这个值提交给后端:
<!-- login.ejs的表单内添加 --> <input type="hidden" name="redirectUrl" value="<%= request.query.redirectUrl || '/' %>">
步骤3:修改后端/login接口,获取并使用redirectUrl
在POST接口里从request.body获取redirectUrl,没有的话默认重定向到/:
// index.js的/login POST接口修改部分 if (results.length > 0) { request.session.loggedin = true; request.session.username = username; request.session.id = results[0].id; // 获取redirectUrl,默认值设为/ let redirectUrl = request.body.redirectUrl || '/'; // 解码URL,避免编码问题 redirectUrl = decodeURIComponent(redirectUrl); response.redirect(redirectUrl); }
替代方案:用后端Session存储跳转路径
如果不想用查询参数,也可以先通过AJAX把redirectUrl发送到后端存入session,再跳转登录页:
- 在products.ejs里添加AJAX请求:
// products.ejs脚本修改 if (loggedInData === 'false') { event.preventDefault(); const currentPageUrl = window.location.href; // 发送请求把路径存到后端session fetch('/set-redirect-url', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ redirectUrl: currentPageUrl }) }).then(() => { window.location.href = '/login'; }); }
- 在index.js里添加对应的接口:
// index.js新增接口 app.post('/set-redirect-url', (req, res) => { req.session.redirectUrl = req.body.redirectUrl; res.sendStatus(200); });
- 在/login POST接口里读取session中的值:
let redirectUrl = req.session.redirectUrl || '/'; // 用完后可以清除,避免后续影响 delete req.session.redirectUrl; response.redirect(redirectUrl);
内容的提问来源于stack exchange,提问作者Boban Banjevic
相关产品推荐
相关产品推荐

