Você está em: Principal › Artigos › ASP 3.0 › Capítulo 08 : 05
Lição 065 - Capítulo 08 - O objeto Session
Podemos usar o objeto Session para armazenar as informações necessárias para uma determinada sessão de usuário. As variáveis armazenadas no objeto Session não são descartadas quando o usuário alterna entre as páginas do aplicativo; em vez disso, essas variáveis persistem durante toda a sessão de usuário.
O servidor Web cria automaticamente um objeto Session quando uma página da Web de um aplicativo é solicitada por um usuário que já não tem uma sessão. O servidor descarta o objeto Session quando a sessão expira (por TimeOut) ou é abandonada.
Um uso comum para o objeto Session é para armazenar as preferências do usuário. Por exemplo, se um usuário indicar que prefere não visualizar elementos gráficos, você deverá armazenar essa informação no objeto Session.
O diagrama da Figura 8.16, demonstra a relação entre o objeto Application, os diversos objetos Session, o servidor Web e as diversas aplicações Web hospedadas no servidor.
Figura 8.16 Para cada usuário conectado é criado um objeto Session.
Cada aplicação Web possui seu próprio objeto Application e informações disponíveis no objeto Application podem ser acessadas por quaisquer usuário que estiverem acessando a aplicação. Para cada usuário que acessa a aplicação Web é criado um objeto Session, onde ficam armazenadas as informações relacionadas com cada usuário. Também podemos notar, na Figura 8.16, que em um mesmo servidor Web podemos ter várias aplicações Web.
Informações armazenadas no objeto Session do usuário podem ser acessadas em qualquer página da aplicação Web, desta forma é possível passar informações entre as diversas páginas da aplicação Web durante a existência do objeto Session.
O objeto Session é baseado em Cookies, por isso estado da sessão só é mantida para navegadores que suportam Cookies.
Agora passaremos a estudar os eventos, coleções, propriedades e métodos do objeto Session.
Eventos do objeto Session.
Na Tabela 8.4, temos uma descrição dos eventos do objeto Session.
OnStart O evento Session_OnStart ocorre quando o servidor cria uma nova sessão. O servidor processa esse script antes de executar a página solicitada. O evento Session_OnStart é uma ótima oportunidade de definir as variáveis no nível de sessão, porque essa variáveis serão definidas antes de se acessar quaisquer páginas. Todos os objetos incorporados (Application, ObjectContext, Request, Response, Server e Session) estão disponíveis e podem ser referenciados no script do evento Session_OnStart. Você pode chamar o método Redirect no evento Session_OnStart, por exemplo, para assegurar que os usuários sempre iniciem uma sessão em determinada página da Web. Quando o usuário entrar no aplicativo, o servidor criará uma sessão para esse usuário e processará o script do evento Session_OnStart. É possível incluir um script nesse evento para verificar se a página aberta pelo usuário é a página inicial e, se não for, podemos redirecionar o usuário para a página inicial através de uma chamada ao método Response.Redirect.
OnEnd O evento Session_OnEnd ocorre quando uma sessão é abandonada ou o tempo limite expira - TimeOut. Para este evento, somente estão disponíveis os objetos Application, Server e Session.
Tabela 8.4 Os eventos do objeto Session.
O evento Session_OnStart
A seguir é mostrada a sintaxe para este evento.
Sintaxe para o evento Session_OnStart:
<SCRIPT LANGUAGE=Linguagem_de_script RUNAT=Server>
' Código para o evento Session_OnStart. . .
A seguir temos um exemplo de definição de código para o evento Session_OnStart. Neste exemplo são criadas duas variáveis de nível de Sessão. Uma com a estação do ano e outra com cotação do dólar.
<SCRIPT LANGUAGE="VBScript" RUNAT.= "Server">
Session("EstacaoAno") = "Inverno"
Session("CotDolar") = 1.77
Uma das principais utilização do evento Session_OnStart é para a criação e inicialização de variáveis em nível de Sessão ou até mesmo objetos, como por exemplo, uma conexão com um Banco de dados.
Para criar uma variável em nível de sessão, utilizamos a seguinte sintaxe:
Session("Nome_da_Variável") = Valor_da_Variável
As variáveis EstacaoAno e CotDolar podem ser acessadas, pelo usuário conectado, em qualquer página ASP da aplicação Web, pois são variáveis de nível de Sessão, tecnicamente falando, diríamos que são variáveis de nível do objeto Session, as quais estão disponíveis, em qualquer página, para o usuário ligado a Sessão.
Um detalhem importante a ser lembrado é que não é apenas no evento Session_OnStart que podemos definir variáveis de nível de sessão. Em qualquer página ASP podemos definir uma variável que estará disponível em nível de sessão. Para isso utilizamos a mesma sintaxe utilizada no arquivo global.asa, conforme indicado abaixo:
Para acessar os valores das variáveis do objeto Session é muito simples, basta utilizar a sintaxe:
= Session("Nome_da_Variável")
Com isso será retornado o valor da variável.
Vamos a um exemplo prático. Suponhamos que tenham sido definidas três variáveis no evento Session_OnStart, no arquivo global.asa da aplicação Web denominada Capitulo8, conforme indicado na Listagem 8.2, onde temos o arquivo global.asa para a aplicação Capitulo8.
Listagem 8.8 – Arquivo global.asa onde são definidos 3 variáveis de nível de sessão.
2 Sub Session_OnStart
3 Session("Mensagem")= "Bem vindo ao site da empresa ABC LTDA !"
4 'Cotação do dólar até o meio-dia
5 Session("CotAM")= 1.50
6 'Cotação do dólar após o meio-dia.
7 Session("CotPM")= 2.00
Neste exemplo de arquivo global.asa, no evento Session_OnStart, definimos as variáveis Mensagem CotAM e CotPM. Estas são variáveis do objeto Session, portanto disponíveis para qualquer página a ser acessada pelo usuário, desde que tenha sido estabelecida uma conexão. Lembre que se o usuário estiver utilizando um Navegador que não suporta Cookies ou tiver desabilitado o suporte a Cookies, a sessão não será estabelecida e as informações disponíveis no objeto Session não estarão disponíveis.
Agora vamos criar uma página ASP que faz uso destas variáveis. A página usa_sessionvar.asp irá detectar a hora do dia. Até às 11:59 será apresentada a mensagem "Bom Dia" e será informado a cotação do dólar armazenada na variável CotAM. A partir de 12:00 será apresentada a mensagem Boa Tarde e será informada a cotação do dólar armazenada na variável CotPM. Em ambos os casos será emitida a mensagem contida na variável Mensagem.
Na Listagem 8.9 temos o código para a página usa_sessionvar.asp.
Listagem 8.9 – Utilizando variáveis do objeto Session.
4 <TITLE> Utilizando variáveis em nível de Sessão !!</TITLE>
8 ' Atribui a hora do dia para a variável hora_dia
9 hora_dia = hour(Time())
10 Response.Write "Hora do dia: " & hora_dia & "<HR>"
11 If hora_dia<12 Then
12 Response.Write "<HR>"
13 Response.Write "Bom Dia ! <BR>"
14 Response.Write "Cotação do dólar: " & Session("CotAM") & "<BR>"
15 Response.Write Session("Mensagem")
16 Response.Write "<HR>"
18 Response.Write "<HR>"
19 Response.Write "Boa tarde ! <BR>"
20 Response.Write "Cotação do dólar: " & Session("CotPM") & "<BR>"
21 Response.Write Session("Mensagem")
22 Response.Write "<HR>"
Observe que utilizamos a função hour(Time( )). Como parâmetro para a função hour, passamos a função Time ( ). A função Time( ) captura a hora do Servidor Web e a função Hour retira apenas o valor numérico da hora.
Observe que para ter acesso a uma variável do objeto Session é só utilizar a seguinte sintaxe:
Session("Nome_da_Variável")
Ao visualizarmos o arquivo da Listagem 8.9, após o meio-dia, obteremos o resultado indicado na Figura 8.17.
Figura 8.17 Resultado obtido após o meio-dia.
Já ao visualizarmos o arquivo da Listagem 8.3, antes do meio-dia, obteremos o resultado indicado na Figura 8.18.
Figura 8.18 Resultado obtido antes do meio-dia.
A possibilidade de criar variáveis no evento Session_OnStart é bastante interessante, principalmente pelo fato que estas variáveis estarão disponíveis para o usuário em todas as páginas que ele acessar na aplicação Web. Por exemplo, uma vez identificado o usuário, podemos carregar, a partir de um Banco de dados, uma série de informações sobre o mesmo e atribuí-las a variáveis do objeto Session. Com isso em qualquer página da aplicação, as informações sobre o usuário estarão disponíveis.
Um exemplo de utilização do objeto Session é encontrado em sites que oferecem treinamento pela Internet. O usuário faz o cadastro no site e recebe um Username e uma senha. Ao entrar no site, o usuário se identifica através do seu Username e senha. Após identificado, podemos utilizar o objeto Session para localizar informações sobre os cursos em que o usuário está cadastrado, os módulos já cursados e as suas preferências, tais como idioma de exibição da página. Com isso posso criar um conteúdo personalizada para cada usuário, baseado nas preferências do mesmo.
Porém não estamos limitados a criação de variáveis simplesmente. Podemos criar objetos no evento Session_OnStart. Por exemplo, posso criar um objeto do tipo ADODB.Connection e utilizar o método Open do mesmo. Com isso estou disponibilizando uma conexão de Banco de dados para o usuário, em qualquer página da aplicação, esta conexão pode ser utilizada. Esta técnica apresenta, dentre outras, duas vantagens importantes:
Não é necessário a colocação do código para criação da conexão, em cada página que precisar da mesma. Isto facilita a construção das páginas e reduz a possibilidade de erros.
Se, por algum motivo, for necessária a alteração das propriedades da conexão, basta alterar a String de conexão em um único local – no arquivo global.asa, e não em todas as páginas que fazem uso da conexão que está sendo alterada.
Na Listagem 8.10, temos um exemplo de conexão criada no evento Session_OnStart.
Listagem 8.10 – Criando uma conexão no evento Session_OnStart.
5 Session ("CotAM")= 1.50
7 Session ("CotPM")= 2.00
8 'Agora cria uma conexão com o Banco de dados
9 'C:\Meus documentos\nwind.mdb
10 'Esta conexão estará disponível para todas as
11 'páginas da aplicação.
12 Set Session ("conexao")=Server.CreateObject("ADODB.Connection")
13 Session ("conexao").ConnectionString ="PROVIDER=MICROSOFT.JET.OLEDB.4.0;
14 Session("conexao").Open
Para que o objeto conexao seja uma conexão do objeto Session, e com isso esteja disponível para todas as páginas que o usuário acessar dentro da aplicação, devemos utilizar a sintaxe indicada na Listagem 8.10, ou seja:
12 Set Session("conexao")=Server.CreateObject("ADODB.Connection")
Desta forma, precisamos utilizar Session("Nome_do_Objeto"), pois se utilizarmos simplesmente o nome do objeto, a mesma não será pertencerá ao objeto Session e não estará disponível em todas as páginas. O mesmo é válida na definição da propriedade ConnectionString e na utilização do método Open.
Agora que criamos uma conexão no evento Session_OnStart, podemos utilizar esta conexão em qualquer página da aplicação. Vamos a um exemplo de página ASP que utiliza esta conexão.
Na Listagem 8.11 temos uma página ASP que utiliza a conexão criada no evento Session_OnStart. Observe que estamos criado um objeto RecordSet que utiliza esta conexão como parâmetro para o método Open do objeto RecordSet.
Listagem 8.11 – Utilizando a conexão criada no evento OnStart – usa_sessioncon.asp.
4 <TITLE> Utilizando uma conexão criada no arquivo global.asa.</TITLE>
8 'Nesta página estamos criando um objeto RecordSet,
9 'o qual utiliza a conexão Conn criada no evento
10 'Application_OnStart.
11 'O código que cria a conexão está no arquivo global.asa.
12 Set Pedidos = Server.CreateObject("ADODB.Recordset")
13 Pedidos.Open "Select * from Orders Order By OrderID", Session("conexao"), 3, 3
14 'Neste ponto tenho o objeto Pedidos ligado com a tabela
15 'Orders do Banco de dados nwind.mdb.
16 'Agora passo a exibir os resultados.
18 <P><B>Utilizei uma conexão criada no arquivo global.asa.</B></P>
19 <TABLE border=1 width=100%>
21 <TD><B>Código</B></TD>
22 <TD><B>Data</B></TD>
23 <TD><B>Cidade</B></TD>
24 <TD><B>País</B></TD>
27 'Agora exibo os registros obtidos a partir da tabela Orders.
28 Response.Write "Foram encontrados: " & Pedidos.RecordCount & " Registros.<HR>"
29 Pedidos.MoveFirst
30 Do While Not Pedidos.EOF
33 <TD><% =Pedidos.Fields("OrderID") %></TD>
34 <TD><% =Pedidos.Fields("OrderDate") %></TD>
35 <TD><% =Pedidos.Fields("ShipCity") %></TD>
36 <TD><% =Pedidos.Fields("ShipCountry") %></TD>
39 Pedidos.MoveNext
Na Figura 8.19 vemos o resultado quando a página usa_sessioncon.asp é carregada no Internet Explorer.
Figura 8.19 Página que utiliza uma conexão criada no evento Session_OnStart.
Evento Session_OnEnd
Embora possamos criar variáveis e objetos no evento Application_OnEnd isto não teria utilidade prática. Normalmente utilizamos o evento OnEnd para funções administrativas, tais como gravar informações em um log de auditoria ou para gravar escolhas feita pelo usuário em um Banco de dados.
Sintaxe para o evento Session_OnEnd:
' Código para o evento OnEnd. . .
A seguir temos um exemplo de definição de código para o evento OnEnd. Neste exemplo estamos retirando o objeto conexao da memória, para liberar recursos no servidor Web.
Set Application("conexao") = Nothing
Na Tabela 8.5 temos a descrição das coleções do objeto Session.
Contents Contém todos os itens que foram adicionados para uma Sessão, com exceção dos que foram declarados com a tag <OBJECT>. Todas as variáveis e objetos criados com Set, fazem parte desta coleção. Podemos usar a coleção Contents para obter uma lista de itens aos quais tenha sido atribuído escopo do sessão. É possível também remover os itens da coleção com os métodos Remove e RemoveAll. No próximo tópico falaremos sobre os métodos do objeto Application.
StaticObjects A coleção StaticObjects contém todos os objetos criados com as tags <OBJECT> dentro do escopo da Sessão. Podemos usar esta coleção para determinar o valor de uma propriedade específica de um objeto ou fazer iteração através da coleção e recuperar todas as propriedades de todos os objeto.
Tabela 8.5 As coleções do objeto Session.
Agora passaremos a estudar a sintaxe e alguns exemplos de utilização das coleções do objeto Session.
A coleção Contents
Para acessarmos um item da coleção Contents, utilizamos a seguinte sintaxe:
Session.Contents(Chave)
Onde Chave é o nome do item a ser recuperado.
Por exemplo, vamos supor que as seguintes variáveis tenham sido criadas no arquivo global.asa, no evento Application_OnStart
Session("Var1") = "José da Silva"
Session ("Var2") = "Maria do Socorro"
Session ("HoraDia") = Hour(Time( ))
Poderíamos exibir o valor destas variáveis utilizando o seguinte código:
Response.Write "Variáveis de nível de sessão.<HR>"
Response.Write "Var1: " & Session.Contents("Var1") & "<BR>"
Response.Write "Var2: " & Session.Contents("Var2") & "<BR>"
Response.Write "Hora do início da aplicação: " & Session.Contents("HoraDia") & "<BR>"
O comando Session.Contents("Var1"), retorna o valor da variável de sessão Var1, O comando Session.Contents("Var2"), retorna o valor da variável de sessão Var2 e assim por diante.
Como estamos trabalhando com uma coleção, podemos utilizar o operador For Each...Next para percorrer todos os itens da coleção Contents. No exemplo de código a seguir, exibimos o nome de todos os elementos da coleção Contents.
For Each elemento in Session.Contents
Response.Write "Nome do elemento: " & elemento & "<BR>"
Considere a Listagem 8.12, onde fazemos uso do operador For Each...Next para exibir o nome de todos os itens da coleção Contents do objeto Session.
Listagem 8.12 – Acessando os elementos da coleção Contents – contents2.asp.
4 <TITLE>Utilizando a coleção Contents</TITLE>
9 Response.Write "Elementos da coleção Contents. <HR>"
10 For Each elemento in Session.Contents
11 Response.Write "Elemento: " & elemento & "<BR>"
13 Response.Write "<HR>"
Ao carregarmos esta página no Internet Explorer, obtemos o resultado indicado na Figura 8.20.
Figura 8.20 Usando For Each...Next para exibir o nome dos elementos da coleção Contents.
Neste caso a página contents2.asp faz parte da aplicação que utiliza o arquivo global.asa da Listagem 8.10. Observe que inclusive o elemento conexao, o qual é um objeto do tipo Connection, faz parte da coleção Contents.
Poderíamos modificar a Listagem 8.6, para que além de exibir o nome de cada elemento, a mesma exibisse o valor de cada um dos elementos. Esta alteração está indicada na Listagem 8.12.
Listagem 8.12 – Exibindo o nome e o conteúdo dos elementos da coleção Contents.
8 <TABLE border=1 width=100%>
10 <TD><B>Elemento</B></TD>
11 <TD><B>Valor</B></TD>
14 Response.Write "Elementos da coleção Contents. <HR>"
15 For Each elemento in Application.Contents %>
17 <TD><% =elemento %> </TD>
18 <TD><% =Session.Contents(elemento)%></TD>
20 <%
Ao carregarmos esta nova versão da página, no Internet Explorer, obtemos o resultado indicado na Figura 8.21.
Figura 8.21 Usando For Each...Next para exibir o nome e o conteúdo dos elementos da coleção Contents.
A coleção StaticObjects
Para acessarmos um item da coleção StaticObjects, utilizamos a seguinte sintaxe:
Session.StaticObjects(Chave)
Como estamos trabalhando com uma coleção, podemos utilizar o operador For Each...Next para percorrer todos os itens da coleção Contents. No exemplo de código a seguir, exibimos o nome de todos os elementos da coleção StaticObjects.
For Each elemento in Session.StaticObjects
Agora que já conhecemos os eventos e coleções do objeto Application, vamos ao estudo dos métodos deste objeto.
Na Tabela 8.6 temos a descrição dos métodos do objeto Session.
Abandon O método Abandon elimina todos os objetos armazenados em um objeto Session e libera seus recursos. Se você não chamar o método Abandon explicitamente, o servidor eliminará esses objetos quando a sessão atingir seu tempo limite. Quando o método Abandon é chamado, o objeto Session atual é colocado em fila para exclusão, mas na verdade não é excluído até que todos os comandos de script da página atual tenham sido processados. Isso significa que você pode acessar as variáveis armazenadas no objeto Session na mesma página que utilizou o método Abandon, mas não em quaisquer páginas subseqüentes da aplicação Web.
Contents.Remove O método Session.Contents.Remove exclui um item especificado da coleção Contents. O método Contents.Remove considera uma seqüência de caracteres ou um inteiro como um parâmetro de entrada. Se o parâmetro de entrada for uma seqüência de caracteres, o método pesquisará a coleção Contents para localizar um item com esse mesmo nome e o removerá. Se o parâmetro de entrada for um inteiro, o método contará o número de itens equivalente a partir do início da coleção e removerá o item correspondente.
Contents.RemoveAll O método Session.Contents.RemoveAll remove todos os itens que foram adicionados à coleção Session.Contents.
Tabela 8.6 Os métodos do objeto Session.
Agora vamos analisar alguns exemplos de código que utilizam os métodos do objeto Application.
A sintaxe para o método Contents.Remove é a seguinte:
Session.Contents.Remove(Nome_da_Variável)
No exemplo a seguir são adicionadas três variáveis em nível de sessão. Depois utilizamos o método Contents.Remove para remover uma das variáveis.
Session("Nome") = Request.Form("nome")
Session ("Idade") = Request.Form("idade")
Session ("ValorDolar") = 1.72
Session.Contents.Remove(Idade)
A sintaxe para o método Contents.RemoveAll é a seguinte:
No exemplo a seguir são adicionadas três variáveis em nível de sessão. Depois utilizamos o método Contents.RemoveAll para remover todas as variáveis, inclusive variáveis que tenham sido adicionadas pela sessão do usuário, em outras páginas ASP da aplicação, ou através do arquivo global.asa utilizando o método Session_OnStart.
Session ("Nome") = Request.Form("nome")
A sintaxe para o método Abandon é a seguinte:
Observe o exemplo a seguir, onde utilizamos o método Session.Abandon, porém após termos utilizado o método, definimos e exibimos uma variável em nível de sessão. Esta variável será exibida pois, conforme descrito anteriormente, a Sessão somente será destruída após todas as linhas de Script da página que chamou o método Session.Abandon terem sido executadas.
Session("NomeUsuario") = "José da Silva"
Response.Write "Nome do usuário: " & Session ("NomeUsuario")
O servidor cria um novo objeto Session quando você abre uma página subseqüente da aplicação Web depois de abandonar uma sessão. Você pode armazenar variáveis e objetos nesse novo objeto Session.
Agora vamos ao estudo das propriedades do objeto Session.
Na Tabela 8.7 temos a descrição das propriedades do objeto Session.
CodePage É uma propriedade de leitura e escrita, representada por um número inteiro. A propriedade CodePage determina a página de código que será usada para exibir o conteúdo dinâmico de uma página ASP. Uma página de código é um conjunto de caracteres que pode incluir números, marcas de pontuação e outros hieróglifos. Diferentes idiomas e locais podem usar diferentes páginas de código. Por exemplo, a página de código ANSI 1252 é usada para o inglês americano e a maioria dos idiomas europeus; a página de código OEM 932 é usada para o Kanji japonês.
LCID A propriedade LCID determina o identificador de local que será usado para exibir o conteúdo dinâmico.
SessionLD A propriedade SessionID retorna o identificador da sessão, um identificador exclusivo que é gerado pelo servidor quando a sessão é criada. Uma identificação da sessão é retornada como um tipo de dado LONG.
Timeout A propriedade TimeOut especifica o tempo limite de duração do objeto Session para esse aplicativo, em minutos. Se o usuário não atualizar ou solicitar uma página dentro do período de limite de tempo, a sessão é encerrada pelo Servidor IIS.
Tabela 8.7 Propriedades do objeto Session.
Vamos estudar mais alguns detalhes sobre estas propriedades.
A sintaxe para a propriedade CodePage é a seguinte:
Session.CodePage = número_página_código
Na Tabela 8.8 temos o número para algumas páginas de código.
437 MS-DOS / EUA.
850 MS-DOS / Internacional.
1251 Windows / Rússia.
1252 Windows/ ANSI.
1253 Windows/ Grécia.
10000 Macintosh/ Padrão.
Tabela 8.8 Principais páginas de Código
A sintaxe para a propriedade LCID é a seguinte:
Session.LCID = número_indicador_local
Session.LCID = 0816
Este comando define as configurações de localidade para o Português de Portugal. O código para o Brasil é 0416.
As configurações de localidade definem diversas configurações, como por exemplo o símbolo da moeda, o número de casas decimais, o formato da data e da hora, etc. São as opções configuradas através do ícone Opções regionais do Painel de Controle. Para maiores detalhes sobre a configuração das Opções regionais, consulte o Capítulo 2 do livro "Série Curso Básico & Rápido Microsoft Windows 2000 Server", de minha autoria e publicado pela editora Axcel Books.
A sintaxe para a propriedade SessionID é a seguinte:
Response.Write "Identificador da sessão: " & Session.SessionID
Este comando retorna um resultado semelhante ao seguinte:
Identificador da Sessão: 117013627
O número varia, pois para cada sessão este número é gerado automaticamente pelo Servidor IIS.
Você não deve usar a propriedade SessionID para gerar valores de chave primária para um aplicativo de banco de dados. Porque se o servidor Web for reinicializado, alguns valores de SessionID poderão ser os mesmos daqueles gerados antes do servidor ser parado. Em vez disso, você deve usar os campos de Auto-incremento do próprio Banco de dados.