Node.js会话模块开发异常:访问/admin点击登录后重定向回原页面
问题分析与解决方案
我帮你定位到了问题的核心,主要出在前端jQuery代码的逻辑顺序错误,导致登录请求没有正确携带邮箱信息,后端无法创建有效的会话,所以/admin页面会一直重定向回登录状态。
问题细节
你的$.post请求写在了$('#submit').click事件的外部——这意味着页面刚加载完成就会发送登录请求,而不是点击「提交」按钮的时候。此时email和password变量还没有被赋值,后端收到的是undefined,自然无法设置有效的会话,所以访问/admin时会判定你未登录,重回到登录流程。
另外,你没有阻止提交按钮的默认行为,可能会引发页面刷新,干扰AJAX请求的正常执行。
修复后的代码
修正后的 index.html
<!DOCTYPE html> <html> <head> <title>Login Page</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script> </head> <script type="text/javascript"> $(document).ready(function(){ $('#submit').click(function(e){ // 阻止按钮默认的提交行为,避免页面刷新 e.preventDefault(); var email = $("#email").val(); var password = $("#password").val(); // 简单校验,确保邮箱不为空 if(!email) { alert("请输入邮箱"); return; } // 把POST请求放在点击事件内部,确保点击时才发送 $.post("/login", { email: email, password: password }, function(data){ if(data === 'done') { window.location.href = "/admin"; } }); }); }); </script> <body> Email <input type="text" id="email" name=""><br> Password <input type="password" id="password" name=""><br> <input type="submit" id="submit"> </body> </html>
后端代码优化建议(可选但重要)
你当前全局声明了sess变量,这在多用户场景下会导致会话冲突(比如A用户的会话会被B用户覆盖)。建议去掉全局的sess,每次直接从req.session获取:
// 去掉全局的 var sess; app.get('/', function(req, res){ const sess = req.session; // 改为局部变量 if(sess.email) { res.redirect('/admin'); } else { res.render('index.html'); } }); app.post('/login', function(req, res) { const sess = req.session; // 局部变量 sess.email = req.body.email; res.end('done'); }); app.get('/admin', function (req, res){ const sess = req.session; // 局部变量 if(sess.email) { res.write('<h1>Hello '+sess.email+'</h1><br>'); res.end('<a href="/logout">Logout</a>'); } else { res.write('<h1>Please login first.</h1>'); res.end('<a href="/">Login</a>'); } });
测试步骤
- 替换上述修正后的代码
- 重启你的Node.js服务
- 访问
http://localhost:8000,输入邮箱后点击提交,就能正常跳转到/admin页面了
内容的提问来源于stack exchange,提问作者Vikal Singh
相关产品推荐
相关产品推荐

