Я только что реализовал решение, подобное тому, о котором спросили здесь, и, похоже, он работает. У меня есть приложение MVC
и этот код есть на моей странице _Layout.chtml, но он может работать в приложении asp.net
, поместив его на главную страницу, я бы подумал. Я использую локальное хранилище сеансов через плагин amplify.js
. Я использую локальное хранилище сеансов, потому что, как говорит мистер Граверс, может существовать ситуация, когда пользователь обращается к приложению таким образом, который не вызывает обновление или перенаправление страницы, но все же сбрасывает тайм-аут сеанса на сервере.
$(document).ready(function() {
var sessionTimeout = '@(Session.Timeout)'; //from server at startup
amplify.store.sessionStorage("sessionTimeout", sessionTimeout);
amplify.store.sessionStorage("timeLeft", sessionTimeout);
setInterval(checkSession, 60000); // run checkSession this every 1 minute
function checkSession() {
var timeLeft = amplify.store.sessionStorage("timeLeft");
timeLeft--; // decrement by 1 minute
amplify.store.sessionStorage("timeLeft", timeLeft);
if (timeLeft <= 10) {
alert("You have " + timeLeft + " minutes before session timeout. ");
}
}
});
Затем на странице, где пользователи не вызывают обновления страницы, но все-таки попал в сервер, тем самым вызывая сброс их сессии я ставлю это на события нажатия кнопки:
$('#MyButton').click(function (e) {
//Some Code that causes session reset but not page refresh here
amplify.store.sessionStorage("sessionTimeout", 60); //default session timeout
amplify.store.sessionStorage("timeLeft", 60);
});
Использование локального хранения сессии позволяет моему _Layout.chtml коду увидеть, что сеанс был сброшен здесь, даже если страница никогда не обновлялась или не перенаправлялась.
Такое решение работает только в том случае, если ваше приложение не использует более одной страницы за раз. Что делать, если пользователь открывает всплывающее окно и что-то там нажимает? Сеанс будет «обновлен», но время прокрутки первой страницы продолжает работать. –
Я согласен с мистером Гривсом. Если у вас несколько страниц, решение одной клиентуры на одной странице является неточным/вводящим в заблуждение. Я действительно нашел этот вопрос, потому что искал многостраничное решение. – SAGExSDX
Каждое решение имеет свои недостатки. Вы также можете пойти наоборот: используйте ajax, чтобы сохранить сеанс до тех пор, пока страница открыта, но вы не захотите этого в онлайн-приложении для банковского дела. –