Опубликован: 20.02.2006 | Уровень: специалист | Доступ: платный
Лекция 12:

Программирование на ASP

< Лекция 11 || Лекция 12: 123456789

Объект Session

Объект Session представляет собой готовое средство управления состоянием с помощью элементов cookie. Объект Session управляет временем сеанса и информацией о конечном пользователе, запрещая программисту считывать и записывать значения элементов cookie и времени проверки для сеанса. Если компьютер клиента не разрешает использование элементов cookie, то объект Session не сможет записать сеансовый элемент cookie и будет функционировать неправильно. Элемент cookie, записываемый объектом Session, не имеет срока действия, поэтому он удаляется при закрытии браузера. Объект Session содержит все данные сеанса в наборе Session.Contents. Объектом Session и набором Contents управляют так же, как и другими наборами объектов ASP. WriteCollection (особая подпрограмма в листинге 12.2) используется для отображения содержимого набора Session.Contents точно так же, как при записи элементов cookie, переменных формы и наборов QueryString в браузер. В листинге 12.5 приведен пример кода, в котором объект Session используется аналогично набору Request.Cookies.

<%@ Language=VBScript %>

<!--#include file="CommonSubs.inc"-->
<%

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'sub UpdateSession
'Performs a simple Session object read and write
'
'obtains the current time and the previous Session   
'value for Number. The value for Number is incremented.
'All new values are written to the Session.
'
'in 
'      oSession = any 1 based collection - specifically 
'     Session Object
'     NewTime = new time generated written to Session
'     NewNumber = new number written to Session
'     
'out - nothing - writes to client.  
'     NewTime, NewNumber are updated.
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub UpdateSession(oSession, NewTime, NewNumber)

     dim sSession
     
     'get time and date for right now
     NewTime = now()

     'get session value
     sSession = oSession("Number")

     'make it a number and increment
     NewNumber = cint(sSession) + 1
     
     'write the new values
     oSession("Number") = NewNumber
     oSession("LastTime") = NewTime
     oSession("Name") = "birdhouse"
     
end sub

%>
<HTML>
<HEAD>
<title>managing a session using the session object</title>
</HEAD>
<BODY>

<p> Here is the session prior to update</p>

<%
dim sTime
dim sNumber

'write Session collection
WriteCollection Session.Contents , "Session Contents"

'write some other sundry values
Response.Write("<br>Session.SessionID:" & Session.SessionID)
Response.Write("<br>Session.Timeout:" & Session.Timeout)

'update session and get new values that are written to session
UpdateSession Session.Contents, sTime, sNumber

'set session timeout to 1 minute - default is 20 minutes
Session.Timeout=1

%>

<hr>
<p>The session LastTime value will be updated to <% =sTime %></p>
<p>The session Number value will be updated to <% =sNumber %></p>

</BODY>
</HTML>
Листинг 12.5. ReadWriteSession.asp - ASP Page Using the Session Object

Листинг 12.5 представляет собой код ASP, выполняющий считывание значения объекта Session, обновление значения и запись новых значений в объект Session. Подпрограмма WriteCollection представляет собой файл включения, указанный в строке <!--#include file="CommonSubs.inc"-->. Два других свойства, уникальных для объекта SessionSessionID и Timeout – записываются в браузер. Подпрограмма UpdateSession вызывается с помощью набора Session.Contents с использованием в качестве аргументов переменных sTime и sNumber. Переменные sTime и sNumber являются пустыми переменными, которым присваиваются значения сеанса в подпрограмме. После установки значения Session.Timeout, равного 1 минуте, в браузер записывается информация об обновлениях, внесенных в сеанс.

В VBScript по умолчанию все параметры в функции или подпрограмме передаются по обращению. Это значит, что значения аргументов примут в результате работы функции или подпрограммы значения переданных аргументов. В подпрограмме UpdateSession переменным sTime и sNumber не присвоено значений при их передаче в UpdateSession в качестве аргументов. В подпрограмме значение переменной sTime устанавливается равным текущему времени с помощью функции now(), а переменной sNumber – предыдущему значению, к которому прибавляется единица. После завершения подпрограммы обе переменные sTime и sNumber содержат новые значения, присвоенные им функцией UpdateSession. Если перед любым параметром в объявлении прототипа подпрограммы расположить ключевое слово byval, то передаваемый аргумент не будет изменяться после завершения подпрограммы.

При первом выполнении кода ASP в файле ReadWriteSession.asp (см. листинг 12.5) в браузере отображаются значения объекта Session. Параметр Session.Timeout по умолчанию равен 20, и в сеансе не устанавливаются никакие значения до тех пор, пока ASP не завершит свое выполнение. На рисунке 12.10 показаны результаты первого выполнения сеансового кода ASP.

Выходные данные сеанса по умолчанию

Рис. 12.10. Выходные данные сеанса по умолчанию

Обновление файла ReadWriteSession.asp вызывает повторное выполнение кода ASP и обновление сеансового объекта посредством присвоения новых значений, а также вывод значений в браузер (см. рис. 12.11). Объект Session может содержать значения, ассоциированные с именем, подобно элементам cookie, что позволяет использовать его в качестве механизма управления состоянием приложения между запросами страницы. Элементы cookie (см. рис. 12.9) добавлены в объект Session для демонстрации аналогии хранения и получения данных с помощью сеанса и элемента cookie. Файл ReadWriteSession.asp также устанавливает новое значение Session.Timeout, равное 1 минуте.


Рис. 12.11.
Ограничения объекта Session

Объект Session имеет некоторые ограничения, с которыми необходимо ознакомиться, прежде чем реализовывать управление состоянием с помощью ASP на базе объекта Session. Сеанс не повторяется и не является общим между серверами, работающими в так называемой веб-ферме.

Данные сеанса хранятся непосредственно на несущем сервере, инициировавшем сеанс. При первом запросе пользователем ASP-страницы с помощью сеанса ASP на хост клиента записывается сеансовый элемент cookie. Сеансовый cookie содержит единственное значение, выступающее в роли ключа. При запросе другой ASP-страницы библиотека ASP.DLL получает сеансовый элемент cookie и просматривает данные, которые будут присвоены объекту Sesion, с помощью ключа, полученного из сеансового cookie. Если страница ASP обслуживается другим веб-сервером, входящим в состав веб-фермы, то данные сеанса веб-сервера, на котором создан элемент cookie, на этом хосте отсутствуют, и сеанс не будет загружен.

При использовании объекта ASP Session в его первоначальном виде можно задействовать только один сервер. Решение этой проблемы заключается в создании и использовании сеансового сервера, управляющего данными сеанса для веб-серверов – членов веб-фермы. Хосты, являющиеся членами веб-фермы, по мере необходимости могут получать данные сеанса запрашивающих сторон от сеансового сервера. Подробный рассказ об этом подходе не входит в данную книгу, однако вам следует обязательно ознакомиться с ним, если в веб-ферме применяется ASP-конструкция с объектом Session. ASP.NET предлагает более простое решение, представляющее собой внутреннюю часть этой технологии; о нем мы расскажем в лекции 2 курса Программирование в "IIS".

< Лекция 11 || Лекция 12: 123456789
Александр Тагильцев
Александр Тагильцев

Где проводится профессиональная переподготовка "Системное администрирование Windows"? Что-то я не совсем понял как проводится обучение.

Владимир Кирин
Владимир Кирин
Неполодки на ресурсе.При сдаче 7 теста, открывается пустое окно, и ничего не происходит.Поправте пожалуйста. При этом попытка считается защитана, перездача только через 30 мин. Использую браузер опера.
Евгений Северин
Евгений Северин
Казахстан, Астана
Ярославй Грива
Ярославй Грива
Россия, г. Санкт-Петербург