HTTP é um protocolo sem estado, o que significa que cada vez que um cliente recupera uma página da web, uma conexão de servidor separada é aberta, de modo que o servidor não registra nenhuma informação de solicitações anteriores do cliente.
Existem três maneiras de manter uma sessão cliente-servidor:
Um servidor web pode atribuir um ID de sessão exclusivo como um cookie para representar cada cliente e identificar solicitações subsequentes desse cliente.
Esta pode não ser uma forma eficiente, pois muitas vezes os navegadores não suportam necessariamente cookies, por isso não recomendamos a utilização deste método para manter a sessão.
Um servidor web pode enviar um campo de formulário HTML oculto e um ID de sessão exclusivo, como este:
<input type="hidden" name="sessionid" value="12345">
Esta entrada significa que quando o formulário for enviado, o nome e o valor especificados serão automaticamente incluídos nos dados GET ou POST. Sempre que o navegador envia uma solicitação, o valor de session_id pode ser usado para salvar rastros de diferentes navegadores.
Essa abordagem pode ser eficiente, mas clicar em um hiperlink em uma tag <A HREF> não gera um evento de envio de formulário, portanto, campos de formulário ocultos não suportam rastreamento de sessão universal.
Você pode adicionar alguns dados adicionais após cada URL para distinguir a sessão, e o servidor pode associar o identificador da sessão com base nesses dados.
Por exemplo, http://w3cschool.cn/file.htm;sessionid=12345, o identificador da sessão é sessionid=12345, o servidor pode usar esses dados para identificar o cliente.
Em comparação, reescrever o URL é a melhor maneira e funcionará mesmo se o navegador não suportar cookies, mas a desvantagem é que você deve especificar dinamicamente o ID da sessão para cada URL, mesmo que seja uma página HTML simples.
Além dos métodos acima, JSP utiliza a interface HttpSession fornecida pelo servlet para identificar um usuário e armazenar todas as informações de acesso deste usuário.
Por padrão, JSP permite rastreamento de sessão e um novo objeto HttpSession será automaticamente instanciado para novos clientes. Desabilitar o rastreamento de sessão requer desligá-lo explicitamente, o que é feito definindo o valor do atributo session na diretiva page como false, como segue:
<%@ sessão da página="false" %>
O mecanismo JSP expõe o objeto de sessão subjacente aos desenvolvedores. Como o objeto de sessão é fornecido, os desenvolvedores podem armazenar ou recuperar dados facilmente.
A tabela a seguir lista alguns métodos importantes do objeto de sessão:
SN | Método e Descrição |
---|---|
1 | public Object getAttribute(String name) retorna o objeto vinculado ao nome especificado no objeto de sessão ou nulo se não existir. |
2 | public Enumeration getAttributeNames() retorna todos os nomes de objetos no objeto de sessão |
3 | public long getCreationTime() retorna a hora em que o objeto de sessão foi criado, em milissegundos, começando na manhã de 1º de janeiro de 1970 |
4 | public String getId() retorna o ID do objeto de sessão |
5 | public long getLastAccessedTime() retorna o horário do último acesso do cliente, em milissegundos, a partir da madrugada de 1º de janeiro de 1970 |
6 | public int getMaxInactiveInterval() retorna o intervalo de tempo máximo, em segundos, durante o qual o contêiner do servlet manterá a sessão aberta |
7 | public void invalidate() invalida a sessão e desvincula quaisquer objetos vinculados à sessão. |
8 | public boolean isNew( retorna se é um novo cliente ou se o cliente se recusa a ingressar na sessão |
9 | public void removeAttribute(String name) remove o objeto com o nome especificado na sessão |
10 | public void setAttribute(String name, Object value) usa o nome e valor especificados para gerar um objeto e vinculá-lo à sessão |
11 | public void setMaxInactiveInterval(int interval) é usado para especificar o tempo, em segundos, durante o qual o contêiner do servlet manterá a sessão válida. |
Este exemplo descreve como usar o objeto HttpSession para obter a hora de criação e a hora do último acesso. Associaremos um novo objeto de sessão ao objeto de solicitação, caso ele ainda não exista.
<%@ page import="java.io.*,java.util.*" %><% // Obtém a hora de criação da sessão Date createTime = new Date(session.getCreationTime()); última página visitada data lastAccessTime = new Date(session.getLastAccessedTime()); new String("visitCount"); String userIDKey = new String("userID"); String userID = new String("ABCD"); ){ title = "Bem-vindo ao meu site"; session.setAttribute(userIDKey, userID); (Inteiro)session.getAttribute(visitCountKey); visitCount = visitCount + 1; userID = (String)session.getAttribute(userIDKey); </title></head><body><center><h1>Acompanhamento de sessão</h1></center><table align="center"> <tr bgcolor="#949494"> <th>Informações da sessão</th> <th>Valor</th></tr> <tr> <td>id</td> <td><% out.print( session. getId()); %></td></tr> <tr> <td>Tempo de criação</td> <td><% out.print(createTime); tr> <td>Hora do último acesso</td> <td><% out.print(lastAccessTime %></td></tr> <tr> <td>ID do usuário</td> <td><%); out.print(userID); <tr> <td>Número de visitas</td> <td><% out.print(visitCount); tr> </table> </body></html>
Tente acessar http://localhost:8080/main.jsp Os seguintes resultados serão obtidos na primeira execução:
Visite novamente e você obterá os seguintes resultados:
Após processar os dados da sessão de um usuário, você terá as seguintes opções:
Remova um atributo específico:
Chame o método public void removeAttribute(String name) para remover o atributo especificado.
Exclua a sessão inteira:
Chame o método public void invalidate() para invalidar a sessão inteira.
Defina o período de validade da sessão:
Chame o método public void setMaxInactiveInterval(int interval) para definir o tempo limite da sessão.
Usuário de logout:
Servidores que suportam o servlet versão 2.4 podem chamar o método logout() para desconectar o usuário e invalidar todas as sessões relacionadas.
Configure o arquivo web.xml:
Se estiver usando o Tomcat, você pode configurar o arquivo web.xml da seguinte maneira:
<session-config> <session-timeout>15</session-timeout> </session-config>
O tempo limite é em minutos e o tempo limite padrão no Tomcat é 30 minutos.
O método getMaxInactiveInterval() no Servlet retorna o tempo limite em segundos. Se 15 minutos estiverem configurados em web.xml, o método getMaxInactiveInterval() retornará 900.