Пользователь нажимает кнопку "Назад", пока сеанс еще аутентифицирован и перенаправляется на страницу входа в node.js

У меня есть простое веб-приложение, в котором есть экран входа в систему и страница активности, доступная только тогда, когда пользователь предоставил действительные учетные данные. Предполагая, что пользователь нажимает на логин с действительными учетными данными и перенаправляется на страницу активности. Теперь пользователь не нажимает на выход из системы, вместо этого он просто нажимает кнопку "Назад" браузера и возвращается на страницу входа в систему. Такое поведение очевидно не интуитивно понятное, я бы предположил, что во время входа пользователя в систему и он нажимает кнопку "Назад", чтобы оставаться на одной странице, а не вернуться на страницу входа.

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

Это простой способ, который я использую в настоящее время, чтобы всегда перенаправлять пользователя на страницу активности, однако я считаю этот ресурс расточительным методом, поскольку есть нежелательные перенаправления. Мой вопрос в том, является ли это стандартным и самым чистым способом реализации вышеуказанного поведения или есть лучший механизм? Я использую паспорт для аутентификации и хранения токенов jwt.

EDIT: повторная итерация вышеупомянутого решения работает только в том случае, если включен кеш-браузер, в отличие от которого контроллер для маршрута входа в систему даже не вызывается, так как браузер кэшировал страницу. Я ищу что-то более надежное. Я не думаю, что это хорошая практика, чтобы жестко закодировать браузер, чтобы не кэшировать страницу в рабочей среде.

Ответ 1

Одна из "функций" (большинства) современных браузеров заключается в том, что нажатие кнопки "Назад" переходит к состоянию, в котором была загружена эта страница. Если вы не будете динамически обновлять страницу входа в систему до перехода к зарегистрированному состоянию, это будет опыт, который вы получите.

То, что я предлагаю вместо этого, однажды проверяется на странице входа в систему, а не сразу перенаправляет пользователя в состояние входа в систему, обновляет зарегистрированную страницу, чтобы указать, что пользователь теперь зарегистрирован (например, если у вас есть аватар /profile в верхнем правом углу, измените внешний вид его на .js, чтобы указать, что пользователь вошел в систему).

Как только состояние входа в систему было изменено, перейдите к соответствующему представлению содержимого (использование метапереадресации может быть наиболее подходящим, но вы можете сделать это, как вам нравится).

Вы можете предположить, что, поскольку пользователь нажал кнопку "Назад", они, вероятно, имели в виду. Это решение гарантирует соблюдение пользователем поведения обратной кнопки, в отличие от принудительного перенаправления путем обнаружения cookie с js и повторной навигацией - что приводит к перекрестным (back-back) перенапряжениям (которые так расстраивают!)

В то время как StackOverflow фактически не выполняет то, что вы пытаетесь сделать, вот пример того, что вы могли бы сделать с .js, чтобы динамически обновлять /login перед тем, как перейти:

введите описание изображения здесь введите описание изображения здесь

Ответ 2

Ваше решение кажется прекрасным. Возможно, вы сможете улучшить свою идею, используя события 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>

Ответ 3

Я не проверял это, но я думаю, что он должен работать. Пытаться js res.redirect('/activity?_='+ Date.now()); чтобы браузер не использовал кешированную страницу.

Ответ 4

У вас есть несколько решений здесь.

Один из них - сказать браузеру не кэшировать/войти. Это имеет смысл по многим причинам. О том, что вы не хотите отключать кеш в производстве, помните, что вы будете отключать кеш только для страницы /login, что не так уж плохо.

Альтернативой может быть добавление некоторого JS-кода на страницу /login, которая увидит, существует ли определенный файл cookie с входом в систему. В случае, если это так, просто обновите страницу. Обновляя страницу, задняя сторона будет выполнена, и перенаправление действительно произойдет.

Я бы пошел первым. Для этого конкретного маршрута что-то в этом направлении будет делать трюк (не проверено).

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