2009-09-24 3 views
0

Я пытаюсь определить, сколько времени осталось в заданном сеансе ASP.NET, пока он не истечет.Получить время доступа к сеансу ASP.NET (или время от времени)

Если нет доступного времени от времени до таймаута, я мог бы также рассчитать его с момента последнего доступа (но я тоже этого не нашел). есть идеи как это сделать?

ответ

2

Если вы находитесь на сервере, обрабатывая запрос, то тайм-аут только что был сброшен, так что оставшиеся 20 минут (или все, что вы настроили) остались.

Если вам требуется предупреждение на стороне клиента, вам нужно будет создать код javascript, который будет срабатывать около 20 минут с «сейчас». См. Метод setTimeout.

Я использовал это для отображения предупреждения, через 15 минут после того, как была запрошена страница. Он выдает предупреждение, как «ваша сессия истекает на {HH: mm}, пожалуйста, сохраните свою работу». Точное время использовалось вместо «через 5 минут», так как вы никогда не знаете, когда пользователь увидит это сообщение (он вернулся на свой компьютер через 10 минут после того, как было выпущено предупреждение?).

+4

Такое решение работает только в том случае, если ваше приложение не использует более одной страницы за раз. Что делать, если пользователь открывает всплывающее окно и что-то там нажимает? Сеанс будет «обновлен», но время прокрутки первой страницы продолжает работать. –

+0

Я согласен с мистером Гривсом. Если у вас несколько страниц, решение одной клиентуры на одной странице является неточным/вводящим в заблуждение. Я действительно нашел этот вопрос, потому что искал многостраничное решение. – SAGExSDX

+0

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

-1

Вы можете получить тайм-аут в течение нескольких минут от:

Session.Timeout 

Разве этого недостаточно, чтобы предоставить информацию, как тайм-аут сбрасывается каждый запрос? Не знаете, как вы хотите отображать это без запроса?

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

1

Для многостраничного решения можно сохранить последнее время запроса в cookie, а javascript может рассмотреть это последнее время доступа для обработки предупреждающего сообщения или действия входа в систему.

0

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