簡體   English   中英

用戶在會話仍處於身份驗證狀態時單擊后退按鈕,並重定向到node.js中的登錄頁面

[英]User clicks on back button while session is still authenticated and gets redirected to login page in node.js

我有一個簡單的Web應用程序,它具有登錄屏幕和活動頁面,只有在用戶提供了有效憑據時才能訪問該頁面。 假設用戶使用有效憑據點擊登錄並重新定向到活動頁面。現在用戶沒有點擊退出,而是他/她只需點擊瀏覽器的后退按鈕並返回登錄頁面。 這種行為顯然是不直觀的,我會假設當用戶登錄並且他/她點擊后退按鈕以保持在同一頁面上而不返回登錄頁面。

function loginUser(req, res) {
    if (req.session.auth) // if user is still authenticated
    {
        res.redirect('/activity');
    }
    res.render('login');
}

這是我目前使用的一種簡單方法,總是將用戶重定向回活動頁面,但是我發現這是一種資源浪費的方法,因為引入了不需要的重定向。 我的問題是,這是實現上述行為的標准和最簡潔的方法還是有更好的機制? 我使用護照進行身份驗證和存儲jwt令牌。

編輯:重新迭代上述解決方案只有在啟用了瀏覽器no-cache時才有效,相反,由於瀏覽器緩存了頁面,因此甚至沒有調用登錄路由的控制器。 我正在尋找更強大的東西。 我認為將瀏覽器硬編碼為不在生產環境中緩存頁面是不錯的做法。

(大多數)現代瀏覽器的“功能”之一是單擊后退按鈕可將您導航回到加載該頁面的狀態。 除非您導航到登錄狀態之前動態更新登錄頁面否則這將是您獲得的體驗。

相反,我建議在登錄頁面上進行身份驗證,而不是立即將用戶重定向到登錄狀態,更新登錄頁面以指示用戶現在已登錄(例如,如果您有頭像/個人資料圖標在右上角,使用.js更改它的外觀以指示用戶已登錄。

一旦登錄視圖的狀態發生了變化,然后導航到相應的內容視圖(使用元重定向可能是最合適的,但您可以按照自己喜歡的方式進行操作)。

您可以假設,因為用戶單擊了后退按鈕,他們可能意味着。 此解決方案確保用戶對后退按鈕行為的期望得到尊重,而不是通過檢測帶有js的cookie並重新導航來強制重定向 - 這會導致前向/后向重定向循環(這非常令人沮喪!)

雖然StackOverflow實際上並沒有做你想要做的事情,但這里有一個例子,說明你可以用.js在你離開之前動態更新/login

在此輸入圖像描述 在此輸入圖像描述

您的解決方案似乎很好 您可以使用window.onbeforeunload和window.onunload事件來改進您的想法。 像這樣的東西:

<script type="text/javascript">
    window.onbeforeunload = onbeforeunload_handler;
    window.onunload = onunload_handler;
    function onbeforeunload_handler() {
        // Do something here
    }

    function onunload_handler() {
       // Or do something here
    }
</script>

我沒有測試過這個,但我認為它應該可行。 嘗試js res.redirect('/activity?_='+ Date.now()); 防止瀏覽器使用緩存頁面。

你有幾個解決方案。

一,是告訴瀏覽器不要緩存/登錄。 這有很多道理。 關於你不想在生產中禁用緩存的問題,請記住你只是為/ login頁面禁用緩存,這並沒有那么糟糕。

另一種方法是在/ login頁面中添加一些JS代碼,以查看是否存在某個已登錄的cookie。 如果是這樣,只需刷新頁面。 通過刷新頁面,將執行后端端,並且實際將發生重定向。

我會選擇第一個。 對於那條特定的路線,沿着這些路線的東西可以解決問題(未經測試)。

res.set({
    'Cache-Control': 'no-cache, no-store, must-revalidate',
    'Pragma' : 'no-cache',
    'Expires' : '0',
})

暫無
暫無

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

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