Servlets - Rastreamento de Sessão
HTTP é um protocolo "sem estado", o que significa que cada vez que um cliente recupera uma página da Web, o cliente abre uma conexão separada com o servidor da Web e o servidor automaticamente não mantém nenhum registro da solicitação anterior do cliente.
Ainda assim, existem três maneiras de manter a sessão entre o cliente web e o servidor web -
Biscoitos
Um servidor da web pode atribuir um ID de sessão exclusivo como um cookie para cada cliente da web e para solicitações subsequentes do cliente, eles podem ser reconhecidos usando o cookie recebido.
Esta pode não ser uma forma eficaz porque muitas vezes o navegador não suporta um cookie, então eu não recomendo usar este procedimento para manter as sessões.
Campos de formulário ocultos
Um servidor da web pode enviar um campo de formulário HTML oculto junto com um ID de sessão exclusivo da seguinte maneira -
<input type = "hidden" name = "sessionid" value = "12345">
Esta entrada significa que, quando o formulário é enviado, o nome e o valor especificados são incluídos automaticamente nos dados GET ou POST. Cada vez que o navegador da web envia a solicitação de volta, o valor session_id pode ser usado para manter o controle de diferentes navegadores da web.
Esta poderia ser uma forma eficaz de controlar a sessão, mas clicar em um link de hipertexto regular (<A HREF...>) não resulta no envio do formulário, portanto, os campos ocultos do formulário também não podem suportar o rastreamento geral da sessão.
Reescrita de URL
Você pode anexar alguns dados extras no final de cada URL que identifica a sessão, e o servidor pode associar esse identificador de sessão aos dados que ele armazenou sobre essa sessão.
Por exemplo, com http://tutorialspoint.com/file.htm;sessionid = 12345, o identificador de sessão é anexado como sessionid = 12345 que pode ser acessado no servidor da web para identificar o cliente.
A regravação de URL é a melhor maneira de manter as sessões e funciona mesmo quando os navegadores não oferecem suporte a cookies. A desvantagem da reescrita de URL é que você teria que gerar cada URL dinamicamente para atribuir um ID de sessão, mesmo no caso de uma página HTML estática simples.
O objeto HttpSession
Além das três maneiras mencionadas acima, o servlet fornece HttpSession Interface que fornece uma maneira de identificar um usuário em mais de uma solicitação de página ou visita a um site da Web e armazenar informações sobre esse usuário.
O contêiner de servlet usa essa interface para criar uma sessão entre um cliente HTTP e um servidor HTTP. A sessão persiste por um período de tempo especificado, em mais de uma conexão ou solicitação de página do usuário.
Você obteria o objeto HttpSession chamando o método público getSession() de HttpServletRequest, conforme abaixo -
HttpSession session = request.getSession();
Você precisa chamar request.getSession () antes de enviar qualquer conteúdo de documento ao cliente. Aqui está um resumo dos métodos importantes disponíveis por meio do objeto HttpSession -
Sr. Não. | Método e Descrição |
---|---|
1 | public Object getAttribute(String name) Este método retorna o objeto vinculado ao nome especificado nesta sessão ou null se nenhum objeto estiver vinculado ao nome. |
2 | public Enumeration getAttributeNames() Este método retorna uma Enumeração de objetos String contendo os nomes de todos os objetos vinculados a esta sessão. |
3 | public long getCreationTime() Este método retorna a hora em que esta sessão foi criada, medida em milissegundos desde a meia-noite de 1º de janeiro de 1970 GMT. |
4 | public String getId() Este método retorna uma string contendo o identificador exclusivo atribuído a esta sessão. |
5 | public long getLastAccessedTime() Este método retorna a hora do último acesso da sessão, no formato de milissegundos desde a meia-noite de 1º de janeiro de 1970 GMT |
6 | public int getMaxInactiveInterval() Este método retorna o intervalo de tempo máximo (segundos), que o container do servlet manterá a sessão aberta entre os acessos do cliente. |
7 | public void invalidate() Este método invalida esta sessão e desassocia todos os objetos ligados a ela. |
8 | public boolean isNew( Este método retorna verdadeiro se o cliente ainda não sabe sobre a sessão ou se o cliente escolhe não ingressar na sessão. |
9 | public void removeAttribute(String name) Este método remove o objeto vinculado ao nome especificado desta sessão. |
10 | public void setAttribute(String name, Object value) Este método liga um objeto a esta sessão, usando o nome especificado. |
11 | public void setMaxInactiveInterval(int interval) Este método especifica o tempo, em segundos, entre as solicitações do cliente antes que o contêiner do servlet invalide esta sessão. |
Exemplo de acompanhamento de sessão
Este exemplo descreve como usar o objeto HttpSession para descobrir a hora de criação e a hora do último acesso de uma sessão. Gostaríamos de associar uma nova sessão à solicitação, se ainda não houver uma.
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
// Extend HttpServlet class
public class SessionTrack extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Create a session object if it is already not created.
HttpSession session = request.getSession(true);
// Get session creation time.
Date createTime = new Date(session.getCreationTime());
// Get last access time of this web page.
Date lastAccessTime = new Date(session.getLastAccessedTime());
String title = "Welcome Back to my website";
Integer visitCount = new Integer(0);
String visitCountKey = new String("visitCount");
String userIDKey = new String("userID");
String userID = new String("ABCD");
// Check if this is new comer on your web page.
if (session.isNew()) {
title = "Welcome to my website";
session.setAttribute(userIDKey, userID);
} else {
visitCount = (Integer)session.getAttribute(visitCountKey);
visitCount = visitCount + 1;
userID = (String)session.getAttribute(userIDKey);
}
session.setAttribute(visitCountKey, visitCount);
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " +
"transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1 align = \"center\">" + title + "</h1>\n" +
"<h2 align = \"center\">Session Infomation</h2>\n" +
"<table border = \"1\" align = \"center\">\n" +
"<tr bgcolor = \"#949494\">\n" +
" <th>Session info</th><th>value</th>
</tr>\n" +
"<tr>\n" +
" <td>id</td>\n" +
" <td>" + session.getId() + "</td>
</tr>\n" +
"<tr>\n" +
" <td>Creation Time</td>\n" +
" <td>" + createTime + " </td>
</tr>\n" +
"<tr>\n" +
" <td>Time of Last Access</td>\n" +
" <td>" + lastAccessTime + " </td>
</tr>\n" +
"<tr>\n" +
" <td>User ID</td>\n" +
" <td>" + userID + " </td>
</tr>\n" +
"<tr>\n" +
" <td>Number of visits</td>\n" +
" <td>" + visitCount + "</td>
</tr>\n" +
"</table>\n" +
"</body>
</html>"
);
}
}
Compile o servlet acima SessionTracke crie a entrada apropriada no arquivo web.xml. Agora, executando http: // localhost: 8080 / SessionTrack exibiria o seguinte resultado quando você executasse pela primeira vez -
Welcome to my website
Session Infomation
Session info
value
id
0AE3EC93FF44E3C525B4351B77ABB2D5
Creation Time
Tue Jun 08 17:26:40 GMT+04:00 2010
Time of Last Access
Tue Jun 08 17:26:40 GMT+04:00 2010
User ID
ABCD
Number of visits
0
Agora tente executar o mesmo servlet pela segunda vez, ele exibirá o seguinte resultado.
Welcome Back to my website
Session Infomation
info type
value
id
0AE3EC93FF44E3C525B4351B77ABB2D5
Creation Time
Tue Jun 08 17:26:40 GMT+04:00 2010
Time of Last Access
Tue Jun 08 17:26:40 GMT+04:00 2010
User ID
ABCD
Number of visits
1
Excluindo Dados da Sessão
Ao terminar com os dados de sessão de um usuário, você tem várias opções -
Remove a particular attribute- Você pode chamar o método public void removeAttribute (String name) para excluir o valor associado a uma chave específica.
Delete the whole session- Você pode chamar o método void invalidate () público para descartar uma sessão inteira.
Setting Session timeout- Você pode chamar o método public void setMaxInactiveInterval (int interval) para definir o tempo limite de uma sessão individualmente.
Log the user out - Os servidores que suportam servlets 2.4, você pode chamar logout para fazer o logoff do cliente do servidor Web e invalidar todas as sessões pertencentes a todos os usuários.
web.xml Configuration - Se você estiver usando o Tomcat, além dos métodos mencionados acima, você pode configurar o tempo limite da sessão no arquivo web.xml da seguinte maneira.
<session-config>
<session-timeout>15</session-timeout>
</session-config>
O tempo limite é expresso em minutos e substitui o tempo limite padrão, que é de 30 minutos no Tomcat.
O método getMaxInactiveInterval () em um servlet retorna o período de tempo limite para aquela sessão em segundos. Portanto, se sua sessão for configurada em web.xml por 15 minutos, getMaxInactiveInterval () retornará 900.