2014-02-21 3 views
1

Я застрял в этой проблеме всю неделю, и меня более чем раздражает тот факт, что я должен исправить это заявление, чтобы соответствовать политикам безопасности, в которых я работаю, в любом случае ...Классический ASP и сеанс Тайм-ауты - отслеживание таймера сеанса?

Я пытаюсь отслеживать сеанс в классическом веб-приложении ASP. Я могу установить session.timeout, а также переменную сеанса в файле session_onstart моего файла gobal.asa. Он работает просто отлично:

Sub Session_OnStart 
Session("LoggedOn") = true 
Session.Timeout = 5 
End Sub 

Далее, на одной странице (чтобы проверить решение этой проблемы), я реализовал решение akiller от here.

мне нужно изменить код, чтобы выглядеть следующим образом:

session.asp 
<% 
Response.ContentType = "application/json" 
If Session("LoggedOn") = true Then 
Response.Write "{""loggedOn"": true}" 
Else 
Response.Write "{""loggedOn"": false}" 
End If 
%> 

и:

<script type="text/javascript"> 
$(document).ready(function() { 

    var checkLoggedOn = function() { 

     $.getJSON('session.asp', function (data) { 
      if (data.loggedOn = false){ 
       alert(data.loggedOn); 
       //Need to get alert working when session time expires before redirect can be used. 
       //window.location.replace("http://stackoverflow.com"); 
      } 
     }); 
    }; 

    // Call checkLoggedOn every x milliseconds 
    setInterval(checkLoggedOn, 30000); 
}); 
</script> 

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

Итак, вот заключительные шаги, которые я пытаюсь выполнить.

  1. триггер Session.Abandon, когда сеанс завершается (на стороне сервера)
  2. Установить сеанс («LoggedOn») ложь в случае Session_OnEnd в global.asa
  3. session.asp возвратит ложь, как результат
  4. перенаправляет пользователя туда, куда ему нужно.

Спасибо,

Ник

+1

Прочитал обновление в этом ответе, которое дает вам решение с использованием другого значения сеанса для хранения 'DateAdd (« n », Session.Timeout, Now())', давая вам точно, когда истечет срок вашей сессии. – Lankymart

ответ

3

Короткий ответ: см this comment by Lankymart.

Более подробный ответ: вы не можете делать то, что хотите.

  1. Каждый раз, когда вы запрос страницы, когда текущий сеанс жив, ASP автоматически продлит срок службы сеанса на timeout значение, присвоенное на этой странице. В этом случае сеанс будет работать до перезапуска IIS.

  2. Установка любых значений в коллекции сеансов в Session_OnEnd бессмысленна: после завершения этого события ASP уничтожит весь объект коллекции сеансов и удалит SessionID из процесса ASP.

  3. Помните, что вызов Session.Abandon не вызывает событие Session_OnEnd сразу: см MSDN http://msdn.microsoft.com/en-us/library/ms524310(v=vs.90).aspx

+0

Я пробовал свой код в своем обновлении. он не работает. Мне пришлось изменить его оригинальный код, чтобы он работал правильно. Я взял некоторые из своих идей с использованием даты и изменил так, что это просто время. моя проблема теперь в том, что этот код в моем файле session.asp: 'If (Cint (DateDiff (" s ", Session (" LoginExpiration "), Time()))) 0 Затем response.write" {"" loggedOn "": true} " Else response.write" {"" loggedOn "": false} " End If' всегда возвращает false, когда через 1 минуту он должен вернуть true ... Я не могу понять, почему это не. – NickD

0

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

Смежные вопросы