Série de palestras ASP (19) Gerenciando sessões
Autor:Eve Cole
Data da Última Atualização:2009-05-30 19:58:38
Um dos desafios do desenvolvimento bem-sucedido de aplicações Web é manter as informações do usuário enquanto o usuário salta de uma página para outra em um aplicativo durante uma visita ou sessão do usuário. HTTP é um protocolo sem estado, o que significa que o servidor Web trata cada acesso a uma página como um acesso não relacionado, o servidor não retém nenhuma informação sobre o acesso anterior, mesmo que o acesso ocorra alguns segundos após o acesso atual. atrás. Essa falta de memória de visitas anteriores dificulta a gravação de aplicativos como catálogos on-line, que podem precisar acompanhar os itens do catálogo que um usuário selecionou enquanto saltava entre diferentes páginas do catálogo.
ASP fornece uma solução exclusiva para gerenciar problemas de informações de sessão. Usando o objeto Sessão ASP e um ID de usuário especial gerado pelo seu servidor, você pode criar um aplicativo inteligente que pode identificar cada usuário recebido e coletar informações usadas pelo aplicativo para rastrear as preferências ou seleções de conteúdo do usuário.
ASP define o ID do usuário por meio de cookies HTTP. Cookies HTTP são pequenos arquivos armazenados no navegador do usuário. Portanto, se você estiver criando um aplicativo para um navegador que não suporta cookies, ou se seus clientes configurarem seus navegadores para não aceitarem cookies, não use a funcionalidade de gerenciamento de sessão do ASP.
Você também pode escrever scripts que serão executados quando o aplicativo for iniciado ou encerrado.
Iniciando e encerrando sessões As sessões podem ser iniciadas de três maneiras:
Um novo usuário solicita acesso a uma URL que identifica um arquivo .asp em um aplicativo cujo arquivo Global.asa contém o procedimento Session_OnStart.
O usuário armazena um valor no objeto Session.
O usuário solicita um arquivo .asp do aplicativo e o arquivo Global.asa do aplicativo usa a tag <OBJECT> para criar uma instância do objeto com escopo de sessão.
Se o usuário não solicitar ou atualizar nenhuma página do aplicativo por um período de tempo especificado, a sessão será encerrada automaticamente. O valor padrão para esse período é 20 minutos. Você pode alterar a configuração de limite de tempo limite padrão do aplicativo definindo a propriedade "Tempo limite da sessão" na página de propriedades "Opções do aplicativo" no Gerenciador de serviços de Internet. Este valor deve ser definido com base nos requisitos da sua aplicação web e no espaço de memória do servidor. Por exemplo, se desejar que os usuários que navegam em seu aplicativo Web permaneçam em cada página por apenas alguns minutos, você deverá reduzir o valor de tempo limite de sessão padrão. Um valor de tempo limite de sessão muito longo fará com que muitas sessões abertas esgotem os recursos de memória do servidor.
Para uma sessão específica, se desejar definir um valor de tempo limite menor que o valor de tempo limite padrão, você poderá definir a propriedade Timeout do objeto Session. Por exemplo, o script a seguir define o valor do tempo limite como 5 minutos.
<%Session.Timeout = 5%>
Você também pode definir um valor de tempo limite maior que a configuração padrão. A propriedade Session.Timeout determina o valor de tempo limite.
Você também pode encerrar explicitamente uma sessão por meio do método Abandon do objeto Session. Por exemplo, para fornecer um botão Sair em uma tabela, defina o parâmetro ACTION do botão como a URL de um arquivo .asp que contém o comando a seguir.
<% Sessão. Abandonar %>
Sobre SessionID e Cookies
Quando um usuário solicita pela primeira vez um arquivo .asp em um determinado aplicativo, o ASP gera um SessionID. SessionID é um número gerado por um algoritmo complexo que identifica exclusivamente cada sessão do usuário. No início de uma nova sessão, o servidor armazena o ID da sessão como um cookie no navegador da Web do usuário.
Um SessionID é muito parecido com uma chave, pois o ASP pode armazenar informações do usuário em um "cofre" no servidor quando o usuário interage com o aplicativo durante uma sessão. Assim como uma chave pode ser usada para acessar itens em um cofre, o conteúdo do “cofre” pode ser acessado através do cookie SessionID do usuário enviado no cabeçalho da solicitação HTTP. Sempre que o ASP recebe uma solicitação de página, ele verifica o cabeçalho da solicitação HTTP para obter o cookie SessionID.
Depois que o cookie SessionID é armazenado no navegador do usuário, o ASP ainda reutiliza o cookie para rastrear a sessão, mesmo que o usuário solicite outro arquivo .asp ou solicite um arquivo .asp em execução em outro aplicativo. Da mesma forma, se o usuário abandonar intencionalmente a sessão ou permitir que ela expire e, em seguida, solicitar outro arquivo .asp, o ASP iniciará uma nova sessão com o mesmo cookie. Somente quando o administrador do servidor reiniciar o servidor ou o usuário reiniciar o navegador da Web, as configurações do SessionID armazenadas na memória serão limpas e o usuário receberá um novo cookie SessionID.
Ao reutilizar o cookie SessionID, o ASP minimiza o número de cookies enviados ao navegador do usuário. Como alternativa, se você decidir que seu aplicativo ASP não requer gerenciamento de sessão, poderá impedir que o ASP rastreie sessões e envie SessionIDs aos usuários.
ASP não envia cookies de sessão nas seguintes circunstâncias:
O estado da sessão do aplicativo está desabilitado.
Uma página ASP é definida como sem sessão, ou seja, a página contém a tag <%@ EnableSessionState=False %>.
Observe que o cookie SessionID não fornece um método permanente de rastreamento de um usuário em múltiplas visitas a um site. As informações de SessionID armazenadas na memória do servidor podem ser facilmente perdidas. Se quiser rastrear usuários que visitam seu aplicativo Web ao longo do tempo, você deverá criar uma identidade de usuário armazenando um cookie especial no navegador Web do usuário e salvando as informações do cookie em um banco de dados.
Armazenar dados no objeto Session
O objeto Session fornece uma matriz associativa dinâmica na qual as informações podem ser armazenadas. Você pode armazenar variáveis numéricas e variáveis de objeto em objetos Session.
As variáveis podem ser armazenadas em um objeto Session atribuindo valores a itens nomeados no objeto Session. Por exemplo, o comando a seguir armazena duas novas variáveis no objeto Session:
<%
Sessão("Nome") = "Jeff"
Sessão("Sobrenome") = "Smith"
%>
As informações podem ser obtidas do objeto Session acessando este item nomeado. Por exemplo, exiba o valor atual de Session("FirstName"):
Bem-vindo <%= Sessão("Nome") %>
Você pode armazenar as preferências do usuário no objeto Session e então acessar as preferências para decidir qual página enviar ao usuário. Por exemplo, você pode permitir que os usuários especifiquem uma versão somente texto do conteúdo na primeira página do seu aplicativo e apliquem essa seleção a todas as páginas subsequentes do aplicativo que o usuário visitar.
<% If Session("ScreenResolution") = "Baixa" Then %>
Esta é a versão em texto da página.
<%outro%>
Esta é a versão multimídia da página.
<% Fim se %>
Você também pode armazenar uma instância de objeto no objeto Session, mas isso afetará o desempenho do servidor.
Gerenciar sessões do Web Farm
As informações da sessão ASP são armazenadas no servidor Web. O navegador deve solicitar uma página do servidor Web para obter o script usado para acessar as informações da sessão. Em um Web Farm (onde muitos servidores Web compartilham a responsabilidade de responder às solicitações dos usuários), as solicitações dos usuários nem sempre são roteadas para o mesmo servidor, mas sim para a URL por um software especial denominado processo de "balanceamento de carga" do aplicativo do site. é atribuído a qualquer servidor gratuito. O processo de balanceamento de carga torna mais difícil preservar as informações da sessão no Web Farm.
Para usar o gerenciamento de sessões ASP em um site com balanceamento de carga, você deve garantir que todas as solicitações de uma sessão de usuário sejam direcionadas ao mesmo servidor Web. Uma abordagem é escrever um procedimento Session_OnStart que use um objeto Response para redirecionar o navegador para o servidor Web que executa a sessão do usuário. Se todos os links nas páginas do seu aplicativo forem relativos, todas as solicitações futuras de uma página serão roteadas para o mesmo servidor.
Por exemplo, um usuário deseja acessar um aplicativo solicitando a URL universal de um site: http://www.microsoft.com. O processo de balanceamento de carga roteia solicitações para o servidor server3.microsoft.com. ASP gerou uma nova sessão de usuário neste servidor. Durante o processo Session_OnStart, o navegador é redirecionado para o servidor especificado:
<% Response.Redirect("http://server3.microsoft.com/webapps/firstpage.asp") %>
O navegador solicitará a página especificada e todas as solicitações futuras serão roteadas para o mesmo servidor.
Usar cookies
Um cookie é um token que o servidor web incorpora no navegador do usuário para representá-lo. Na próxima vez que o mesmo navegador solicitar uma página, ele enviará o cookie recebido do servidor Web. Um cookie permite associar um conjunto de informações a um utilizador. Os scripts ASP usam a coleção Cookies de objetos Response e Request para obter e definir valores de cookies.
Definir cookies
Para definir o valor de um cookie, use Response.Cookies. Se o cookie não existir, Response.Cookies criará um novo cookie. Por exemplo, para enviar ao navegador um nome de cookie ("planeta") com um valor associado ("Marte"), utilize os seguintes comandos, que devem aparecer antes da tag <HTML> da sua página Web:
<% Response.Cookies("planeta")="Marte" %>
Se você deseja que o cookie seja usado apenas durante a sessão atual do usuário, basta enviar o cookie para o navegador. No entanto, se quiser reconhecer o usuário após ele encerrar ou reiniciar o navegador, você deve forçar o navegador a armazenar o cookie no disco rígido do computador. Para salvar um cookie, use a propriedade Expires de Response.Cookies e defina a data para um dia futuro:
<%
Response.Cookies("planeta") = "Marte"
Response.Cookies("planeta").Expires = "1º de janeiro de 1999"
%>
Um cookie pode ter vários valores; esse cookie é chamado de cookie indexado. Cada valor de cookie recebe uma palavra-chave. Você pode definir o valor de uma palavra-chave de cookie específica. Por exemplo:
<% Response.Cookies("planeta")("Marte")="Missões Espaciais" %>
Se um cookie existente tiver um valor de palavra-chave, mas Response.Cookies não especificar o nome de uma palavra-chave, o valor da palavra-chave será excluído. Da mesma forma, se um cookie existente não tiver um valor de palavra-chave, mas Response.Cookies especificar o nome e o valor da palavra-chave, o valor do cookie existente será excluído e um novo par de valores-chave será gerado.
Obter biscoitos
Para obter o valor de um cookie, use a coleção Request.Cookies. Por exemplo, se a solicitação HTTP do usuário definir planet=Mars, a instrução a seguir obterá o valor Mars:
<%= Request.Cookies("planeta") %>
Da mesma forma, para obter um valor de palavra-chave de um cookie indexado, use o nome da palavra-chave. Por exemplo, se o usuário fizer a seguinte solicitação HTTP:
planeta=Marte&Marte=Missões Espaciais
O script a seguir retornará o valor SpaceMissions:
<%= Request.Cookies("planeta")("Marte") %>
Configurando o caminho do cookie Cada cookie armazenado pelo ASP no navegador da Web do usuário contém informações de caminho. Quando o navegador solicita um arquivo cuja localização é igual ao caminho especificado no cookie, o navegador encaminha automaticamente o cookie para o servidor. Por padrão, o caminho do cookie corresponde ao nome do aplicativo que contém o arquivo .asp que gerou originalmente o cookie. Por exemplo, se um arquivo .asp em um aplicativo chamado UserApplication gerar um cookie, toda vez que o navegador da Web do usuário recuperar o arquivo neste aplicativo, o navegador Esse cookie também será encaminhado ao servidor.
Para declarar um caminho para um cookie diferente do caminho padrão do aplicativo, use a propriedade Path da coleção Response.Cookies do ASP. Por exemplo, o script a seguir atribui o caminho SalesApp/Customer/Profiles/ a um cookie chamado Purchases:
<%
Response.Cookies("Compras") = "12"
Response.Cookies("Compras").Expires = "1º de janeiro de 2001"
Response.Cookies("Compras").Path = "/SalesApp/Cliente/Perfis/"
%>
Sempre que um navegador que contém o cookie de Compras solicita um arquivo localizado no caminho /SalesApp/Customer/Profiles/ ou seus subdiretórios, o navegador encaminha o cookie para o servidor.
Muitos navegadores da Web, incluindo os navegadores Microsoft Internet Explorer 4.0 e Netscape, preservam o caso dos caminhos dos cookies. Ou seja, se o caso de um arquivo solicitado for diferente do caminho do cookie reservado, o navegador não encaminhará o cookie para o servidor. Por exemplo, para ASP, os diretórios virtuais /TRAVEL e /travel são o mesmo aplicativo ASP, mas para navegadores que preservam maiúsculas de minúsculas de URL, /TRAVEL e /travel são dois aplicativos diferentes. Você deve garantir que todas as URLs do arquivo .asp tenham o mesmo caso para garantir que o navegador do usuário possa encaminhar o cookie armazenado.
Se desejar, você pode usar a seguinte instrução para definir o caminho do cookie para que o cookie seja encaminhado sempre que o navegador do usuário solicitar um arquivo do seu servidor, independentemente do aplicativo ou do caminho:
Response.Cookies("Compras").Path = "/"
No entanto, observe que o envio de cookies para o servidor sem distinção entre aplicativos pode criar problemas de segurança se o cookie contiver informações confidenciais que não deveriam ser acessíveis por outros programas que não o aplicativo designado.
Preservando o estado sem usar cookies Nem todos os navegadores suportam cookies. Mesmo ao usar um navegador que suporte cookies, alguns usuários podem preferir desativar o suporte a cookies. Se o seu aplicativo precisar responder a navegadores que não suportam cookies, você deverá usar o gerenciamento de sessão ASP.
Se você não usar o gerenciamento de sessão ASP, deverá escrever seu próprio mecanismo para passar informações entre as páginas do seu aplicativo. Existem duas maneiras gerais de realizar esta tarefa:
Adicione parâmetros à string de consulta do URL. Por exemplo:
http://MyServer/MyApp/start.asp?name=Jeff
No entanto, alguns navegadores descartarão parâmetros explícitos passados na string de consulta quando o formulário for enviado com o método GET.
Adicione valores ocultos à tabela. Por exemplo, a tabela HTML a seguir contém um controle implícito. Esse controle não aparece no formato real e não é visível para o navegador da Web do usuário. Através do método HTTP POST, o formulário passa o ID do usuário além das informações fornecidas pelo usuário.
<FORM METHOD="POST" ACTION="/scripts/inform.asp">
<INPUT TYPE="text" NAME="cidade" VALUE="">
<INPUT TYPE="text" NAME="país" VALUE="">
<INPUT TYPE="oculto" NAME="userid" VALUE= <%=UserIDNum(i) %>
<INPUT TYPE="enviar" VALUE="Enter">
Este método requer que todos os destinos de link que transferem informações do usuário sejam codificados como tabelas HTML.
Se você não estiver usando o gerenciamento de sessão ASP, desative o suporte de sessão para seu aplicativo. Quando uma sessão é habilitada, o ASP envia o cookie SessionID para cada navegador que solicita uma página ASP. Para desativar o suporte à sessão, desmarque a caixa de seleção Habilitar Estado da Sessão na página de propriedades Opções do Aplicativo no Gerenciador de Serviços de Internet.
Página ASP sem sessão
O ASP também fornece a capacidade de criar páginas sem sessão, que você pode usar para adiar a criação de sessões até que o usuário acesse uma página ASP que exija controle de sessão.
As páginas sem sessão não executam as seguintes funções:
Execute o procedimento Session_OnStart.
Enviar cookie de ID de sessão.
Crie o objeto Sessão.
Acesse objetos de sessão integrados ou objetos com escopo de sessão criados com a tag <OBJECT>.
Executado sequencialmente com outras solicitações de sessão.
Para configurar .asp para não ter sessão, use a seguinte instrução:
<%@ EnableSessionState=Falso %>
Você deve colocar esse script na primeira linha do arquivo .asp, antes de outros scripts. Por padrão, se esse sinalizador for omitido, o rastreamento de sessão será ativado.
As páginas ASP sem sessão melhoram o desempenho de resposta do servidor, eliminando operações de sessão potencialmente demoradas. Por exemplo, considere a seguinte situação: uma página ASP contém dois quadros HTML, Quadro 1 e Quadro 2, em um conjunto de quadros. O Quadro 1 contém um arquivo .asp que executa um script complexo, enquanto o Quadro 2 contém um arquivo .html simples. Como o ASP executa solicitações de sessão sequencialmente (ou seja, em série), você não verá o conteúdo do quadro 2 até que o script do quadro 1 seja executado. No entanto, se você definir o quadro 1 como sem sessão, a solicitação ASP não será mais processada serialmente e o navegador não precisará esperar que o conteúdo do quadro 1 termine a execução antes de poder processar o conteúdo do quadro 2.
No entanto, a maneira como várias solicitações de quadros diferentes são tratadas depende, em última análise, da configuração do navegador da Web do usuário. Alguns navegadores da Web podem ignorar a configuração sem sessão do arquivo .asp e ainda manipular solicitações em série.