簡體   English   中英

Node.js 如何獲得以前的 url

[英]Node.js How to get previous url

我想獲取以前的 url,例如在我的所有/admin路由中,我打開一個表單,管理員需要重新輸入他的密碼才能重定向到他請求的路由,但問題是在我驗證他的密碼並嘗試之后將他重定向到他最初請求的路線,我沒有這條路線了,它已經丟失了。 例如,admin 請求 /admin/register,會出現一個向validate-password發布的表單,然后如果它發現密碼匹配(輸入正確的密碼),它應該將用戶重定向到他曾經請求的路由,但我不不知道如何得到他請求的初始路線

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'});
    }
});

這就是您使用 cookies 或服務器端會話(也使用 cookie)。 您對用戶進行一次身份驗證,設置一個 cookie,然后在來自該瀏覽器的未來請求中,cookie 將與每個請求一起發送,然后您可以檢查該 cookie 以查看它們是否經過身份驗證並決定它們是什么或不是' t 授權在此基礎上進行操作。 這就是 web 上幾乎每個使用登錄的站點的工作方式。

我建議使用express-session模塊,它為您創建一個服務器端 session(並為您自動管理 cookie),然后當用戶通過身份驗證時,您可以在 session 中設置一個身份驗證標志,以表示您的所有路由需要身份驗證的可以檢查。

您不必使用快速會話。 您可以自己管理 cookie,但您必須確保 cookie 已正確加密(JWT 是一個流行的庫),因此它可以很容易地被流氓客戶端偽造。 而且,您想為用戶保留的任何 state 要么必須保留在 cookie 本身中(cookie 不應保持很大,因為它們在每個 http 請求中來回發送並存儲在瀏覽器中)或者你會將加密的 id 放入 cookie 中,您可以將其用作您自己的服務器端 session object 的密鑰。


在 OP 澄清他們已經在使用 express-session 之后添加的編輯

當重定向到登錄時,您發送查詢字符串或隱藏表單元素是很常見的,這是用戶想要 go 到的原始 URL。 然后,登錄表單會將該查詢字符串或隱藏表單元素連同其登錄表單數據一起發送到服務器。 成功登錄后,服務器會將您重定向到用戶想要 go 到的原始目標 URL。 因此,用戶轉到/admin/add ,被重定向到/login ,但該登錄表單包含一個隱藏的表單元素/admin/add 用戶提交密碼表格。

服務器驗證密碼,然后從登錄表單獲取原始/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();
});

當您 go 渲染此頁面時,您可以像使用message一樣將原始路由附加為本地路由嗎? 您應該能夠添加req.originalUrl並將其傳遞給validatePassword 然后,當該頁面調用 POST 以驗證密碼時,您將重定向 URL 作為正文的一部分傳遞到該頁面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM