Nodejs 验证用户后网页重定向错误

Nodejs 验证用户后网页重定向错误

if(varify){
req.session.logged_in=true;
req.session.user=username;
console.log(‘u:’+req.session.user);
// req.session.sucess=‘success,you may logout<a href="/logout">logout</a>’;
res.redirect(’/admin’,false);

上面是在/admin/login页面的操作,如果验证用户名密码成功,应该要跳转到/admin页面,实际并没有跳转,但是刷新一下页面后会正常跳转。 希望大家能够给出一些见解,感激不尽。


9 回复

当然,可以帮你解决这个问题。根据你提供的代码片段,看起来你在使用 Express 框架,并且在用户验证成功后尝试进行重定向。然而,你遇到了一个重定向错误。

可能的原因

  1. 异步操作未完成:如果你的验证过程是异步的(例如,从数据库查询),可能是因为异步操作尚未完成,你就调用了 res.redirect
  2. 中间件顺序问题:确保你的中间件按正确的顺序执行。
  3. 重定向标志res.redirect 的第二个参数是可选的,默认情况下它会发送一个 HTTP 状态码 302,表示临时重定向。你传递了 false,这可能是导致问题的原因。

示例代码及解释

假设你使用的是 Express 框架,以下是一个改进后的示例:

const express = require('express');
const app = express();

app.use(express.json()); // 用于解析 JSON 请求体
app.use(express.urlencoded({ extended: true })); // 用于解析 URL 编码的请求体

app.post('/login', (req, res) => {
    const username = req.body.username;
    const password = req.body.password;

    // 这里只是一个示例验证逻辑,你需要替换为你自己的验证逻辑
    if (username === 'admin' && password === 'password') {
        req.session.logged_in = true;
        req.session.user = username;
        console.log('u:' + req.session.user);

        // 正确的重定向方式
        res.redirect(302, '/admin');
    } else {
        res.status(401).send('Invalid credentials');
    }
});

app.get('/admin', (req, res) => {
    if (req.session.logged_in) {
        res.send('<h1>Welcome Admin!</h1>');
    } else {
        res.redirect('/login');
    }
});

// 启动服务器
app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

解释

  1. 中间件:我们添加了 express.json()express.urlencoded() 中间件来处理 JSON 和 URL 编码的请求体。
  2. 登录路由/login 路由处理用户的登录请求。如果验证成功,则设置会话变量并重定向到 /admin 页面。
  3. 重定向状态码res.redirect(302, '/admin'); 使用了默认的 302 状态码进行重定向。
  4. 管理员路由/admin 路由检查用户是否已登录,如果没有,则重定向回登录页面。

通过这种方式,你应该能够正确地实现用户验证后的重定向。


代码贴完整。这么一点看不出什么的。

res.redirect(’/admin’,false); 后面有return吗?

res.redirect(’/admin’) 就行了呗。 res.redirect([status], url) <—用法。 所以说你的 res.redirect(’/admin’,false); 我看不太懂。

改成

return res.redirect('/admin')

试试

是因为前面有输出

我觉得不需要RETURN。RES可以直接用。我的RES经常封装在各种函数里。

请问你最后怎么解决的, 我也出现登录后需要跳转的问题

根据你的描述,问题可能是由于 res.redirect('/admin', false); 中的第二个参数 false 导致的。默认情况下,res.redirect() 的第二个参数是 true,表示进行一个 HTTP 302 重定向。如果你设置为 false,那么不会执行重定向。

你可以尝试修改代码,去掉第二个参数,让其默认为 true

if (varify) {
    req.session.logged_in = true;
    req.session.user = username;
    console.log('u:' + req.session.user);
    res.redirect('/admin');
}

另外,确保 /admin 路由已经正确配置并且可以访问。以下是简单的 Express 路由配置示例:

const express = require('express');
const app = express();

app.get('/admin', (req, res) => {
    if (req.session.logged_in) {
        res.send('Welcome to the admin panel!');
    } else {
        res.redirect('/admin/login');
    }
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

通过这些调整,你应该可以解决重定向问题。

回到顶部