Учитывая, что вы должны сделать это на стороне клиента, я бы предпочел JavaScript / jQuery и AJAX над этим методом. Вот пример того, как это сделать.
По сути, вы просто настраиваете вызов AJAX для опроса скрипта, который возвращает (в формате JSON), зарегистрирован пользователь или нет; если это не так, вы можете перенести их на другую страницу.
Преимущества этого метода в том, что вы можете опрашивать в любое время; например каждые 10 секунд, чтобы увидеть, вошел ли пользователь в систему, а не ждать целый час. Это также означает, что вам не нужно указывать значение тайм-аута сеанса в вашем коде, и поэтому вы можете оставить это для определения в IIS. Кроме того, если пользователь вышел из системы в другом месте вашей системы или ваш пул приложений был перезагружен и его сеанс был сброшен, это обнаружило бы это довольно быстро.
Я заметил из твоего профиля, что ты фотограф папарацци. Я бы посчитал метод DSLR и метод заголовка ответа методом дешевой телефонной камеры: o.
Чтобы создать страницу проверки сеанса, создайте файл с именем session.asp (в той же папке, что и другие файлы, чтобы упростить жизнь). В него положено:
<%
Response.ContentType = "application/json"
If Session("LoggedOn") Then
Response.Write "{""loggedOn"": true}"
Else
Response.Write "{""loggedOn"": false}"
End If
%>
Если пользователь вошел в систему, он возвращает {"loggedOn": true}, если он не {"loggedOn": false}. Это то, что мы будем использовать на другой вашей странице для опроса, если они вошли в систему, периодически вызывая эту страницу и читая ответ.
Теперь на ваших страницах, где изначально был ваш код Response.AddHeader. Удалите весь ваш код, поскольку он заменяет его.
Сначала убедитесь, что на ваших страницах есть ссылка на jQuery:
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
А затем поставьте под этой строкой следующее:
<script type="text/javascript">
$(document).ready(function() {
var checkLoggedOn = function() {
$.getJSON('session.asp', function(data) {
if (!data.loggedOn)
window.location.replace("http://stackoverflow.com");
});
};
// Call checkLoggedOn every x milliseconds
setInterval(checkLoggedOn, 30000);
});
</script>
Все хорошо, все должно работать. Я установил выше для опроса каждые 30 секунд (30000), но вы можете увеличить / уменьшить его до того, что вы хотели.
Обратите внимание, я позаимствовал большие части кода выше у https://stackoverflow.com/a/4928564/171703 и https://stackoverflow.com/a/2709160/171703.
Обновление:
Из комментариев ниже, если вы хотите, чтобы сессия пользователя истекла после значения тайм-аута (независимо от того, поддерживают ли они свой сеанс или нет), вы можете сделать это.
Когда пользователь вошел в систему, установите новую переменную сеанса для LoginExpiration:
Session("LoginExpiration") = DateAdd("n", Session.TimeOut, Now())
Это берет текущее время и добавляет к нему значение времени ожидания сеанса - давая вам время, когда их сеанс должен быть уничтожен.
Если вы теперь измените файл session.asp следующим образом, он принимает значение LoginExpiration и возвращает, что пользователь не зарегистрирован в случае:
- Время сеанса пользователей истекло (сброс пула приложений IIS, или они нажали кнопку выхода из системы и т. Д.)
- Текущая дата / время больше установленного времени входа в систему.
Что такое:
<%
Response.ContentType = "application/json"
LoggedOn = "false"
LoginExpiration = Session("LoginExpiration")
DateNow = Now()
If IsDate(LoginExpiration) Then
If DateNow < LoginExpiration Then
LoggedOn = "true"
End If
End If
Response.Write "{"
Response.Write """loggedOn"": " & LoggedOn & ", "
Response.Write """loginExpiration"": """ & LoginExpiration & """"
Response.Write "}"
%>
Я поместил число loginExpiration в ответ JSON, чтобы вы могли работать с ним на стороне клиента, если хотите.