Javascript Node.js如何获取上一个url

Javascript Node.js如何获取上一个url,javascript,node.js,express,routes,express-session,Javascript,Node.js,Express,Routes,Express Session,我想获取以前的url,例如,在所有我的/admin路由中,我打开一个表单,管理员需要重新输入密码以重定向到他请求的路由,但问题是在我验证他的密码并尝试将他重定向到他最初请求的路由后,我不再有此路由,它丢了。例如,admin requests/admin/register,出现一个表单,它发布到验证密码,然后如果它发现密码匹配(输入正确的密码),它应该将用户重定向到他请求的路由,但我不知道如何获得他请求的初始路由 router.all('/admin/*', isAdmin, (req, res,

我想获取以前的url,例如,在所有我的
/admin
路由中,我打开一个表单,管理员需要重新输入密码以重定向到他请求的路由,但问题是在我验证他的密码并尝试将他重定向到他最初请求的路由后,我不再有此路由,它丢了。例如,admin requests/admin/register,出现一个表单,它发布到
验证密码
,然后如果它发现密码匹配(输入正确的密码),它应该将用户重定向到他请求的路由,但我不知道如何获得他请求的初始路由

router.all('/admin/*', isAdmin, (req, res, next) => {
    res.render('validatePassword', {message: 'Please re-enter your password to get access to ' + req.originalUrl});
    // next();
});

router.get('/admin/register', (req, res) => {
    res.render('register', {message: req.flash('message'), role_id: req.user.role_id})
});


// Validate password, admin re-enter password to get access to /admin routes
router.post('/validate-password', async (req, res, next) => {
    const password = req.body.password;
    const match = await passwordController.comparePassword(password, req.user.password);
    console.log(password);
    if (match) {
        // return res.redirect('/' +); HOW DO I REDIRECT HERE
        return next();
    } else {
        // return res.render('changePassword', {role_id: req.user.role_id});
        return res.render('validatePassword', {message: 'Wrong password'});
    }
});

这就是您使用cookie或服务器端会话(也使用cookie)的目的。您对用户进行一次身份验证,设置一个cookie,然后在将来来自该浏览器的请求中,cookie将与每个请求一起发送,然后您可以检查该cookie,查看它们是否经过身份验证,并根据此确定它们是否有权执行操作。这就是网络上几乎所有使用登录的站点的工作方式

我建议使用,它为您创建服务器端会话(并为您自动管理cookie),然后当用户通过身份验证时,您可以在会话中设置一个auth标志,所有需要auth的路由都可以检查该标志

您不必使用快速会话。你可以自己管理cookie,但是你必须确保cookie被正确加密(JWT是一个流行的库),这样它就可以很容易地被恶意客户端伪造。而且,您要为用户保留的任何状态都必须保存在cookie本身中(cookie应该保持不太大,因为它们在每个http请求中来回发送并存储在浏览器中),或者您必须在cookie中放置一个加密的id,您可以将其用作您自己的服务器端会话对象的密钥


在OP澄清他们已经在使用快速会话后添加的编辑

当重定向到登录时,通常会发送一个查询字符串或隐藏的表单元素,这是用户想要访问的原始URL。然后,登录表单将把查询字符串或隐藏的表单元素及其登录表单数据发送到服务器。成功登录后,服务器会将您重定向到用户想要访问的原始目标URL。因此,用户转到
/admin/add
,被重定向到
/login
,但该登录表单包含一个隐藏的表单元素
/admin/add
。用户提交密码表单

服务器验证pwd,然后从登录表单获取原始的
/admin/add
url,并将用户重定向到该url。您的身份验证检查显示用户刚刚登录,因此允许他们继续操作。

此处:

router.all('/admin/*', isAdmin, (req, res, next) => {
    res.render('validatePassword', {message: 'Please re-enter your password to get access to ' + req.originalUrl});
    // next();
});

当您要呈现此页面时,是否可以像处理
消息
一样将原始路由附加为本地路由?您应该能够添加
req.originalUrl
并将其传递给
validatePassword
。然后,当该页面调用POST来验证密码时,您将重定向URL作为正文的一部分传递到该页面。

我已经在使用express session并存储会话ID cookie,我只希望已经登录的管理员重新输入密码,以确保某些情况下的安全性routes@JohnnyBra-嗯,然后将会话中需要的任何状态保留在上一个路由上,并在下一个路由中进行检查。会话对象是如何跟踪每个用户的情况。如果您只想知道最后一条路线,那么只需将其放入会话中并在那里进行检查。如果你在问题中包含这些信息,我本可以写一个更有针对性的答案。我遇到的问题是:我有两个路由/admin/add和/admin/register,这两个路由都需要重新输入密码,但现在当用户请求这两个管理路由中的任何一个时,我将用户发送到验证密码表单,他输入的密码是正确的,我无法知道他最初请求的是哪条路径,请求/管理/添加还是/管理/注册?很抱歉confusion@JohnnyBra-当重定向到登录时,通常会发送一个查询字符串或隐藏的表单元素,这是用户想要访问的原始URL。然后,登录表单将把查询字符串或隐藏的表单元素及其登录表单数据发送到服务器。成功登录后,服务器会将您重定向到用户想要访问的原始目标URL。因此,用户转到
/admin/add
,被重定向到
/login
,但该登录表单包含一个隐藏的表单元素
/admin/add
。用户提交密码表单。基本上,这个问题的答案和他们的后续问题相同,这并不是一个真正不同的问题。