Классический ASP / Перенаправление сеанса - PullRequest
2 голосов
/ 07 января 2012

Я хочу автоматически перенаправить на страницу входа по истечении сеанса пользователя.

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

Session.Timeout = 60
Response.AddHeader "Refresh", CStr(CInt(Session.Timeout + 1) * 60)
Response.AddHeader "cache-control", "private"
Response.AddHeader "Pragma","No-Cache"
Response.Buffer = True
Response.Expires = 0
Response.ExpiresAbsolute = 0

If Session("accountID") = "" Then
    Response.Redirect("http://www.mydomain.com/")
End If

Это работает, но есть очень небольшая ошибка.Время от времени страница обновляется, хотя сеанс еще жив, и кажется, что он обновляется до истечения 60 минут!

Кто-нибудь может увидеть, в чем проблема, или вы можете предложить другой метод?

Ответы [ 2 ]

6 голосов
/ 08 января 2012

Учитывая, что вы должны сделать это на стороне клиента, я бы предпочел 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 и возвращает, что пользователь не зарегистрирован в случае:

  1. Время сеанса пользователей истекло (сброс пула приложений IIS, или они нажали кнопку выхода из системы и т. Д.)
  2. Текущая дата / время больше установленного времени входа в систему.

Что такое:

<%
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, чтобы вы могли работать с ним на стороне клиента, если хотите.

0 голосов
/ 09 января 2012
'If the session variable is False or does not exist (IsNull)
'then redirect the user to the unauthorised user page
If Session("accountID") = False or IsNull(Session("accountID")) = True then
 'Redirect to unathorised user page
 Response.Redirect "pagename.asp"
End If 

Поместите это во включаемый файл, который вы включаете во все страницы, которые вы хотите защитить.

<%@LANGUAGE="VBSCRIPT"%>
<!--#include file="checkmem.asp"-->
<!--#include file="includes/dtdsql.asp" -->
<!--#include file="includes/functions.asp" -->
...