Пользователь нажимает кнопку "Назад", пока сеанс еще аутентифицирован и перенаправляется на страницу входа в 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',
})