English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Rastreamento de Sessão Servlet

HTTP é um protocolo "sem estado", o que significa que cada vez que o cliente recupera uma página, ele abre uma conexão separada com o servidor Web, e o servidor não mantém nenhum registro anterior das solicitações do cliente.

Mas ainda existem três maneiras de manter a sessão entre o cliente Web e o servidor Web:

Cookies

Um servidor web pode atribuir um ID de sessão de session único como cookie para cada cliente web, e o cliente pode usar o cookie recebido para identificar solicitações subsequentes.

Isso pode não ser um método válido, pois muitos navegadores não suportam cookies, então recomendamos não usar esse método para manter a sessão de session.

Campo de formulário oculto

Um servidor web pode enviar um campo de formulário HTML oculto, juntamente com um ID de sessão de session único, conforme mostrado a seguir:

<input type="hidden" name="sessionid" value="12345">

Isso significa que, quando o formulário é submetido, o nome e o valor especificados são automaticamente incluídos nos dados GET ou POST. Cada vez que o navegador web enviar uma solicitação de volta, o valor session_id pode ser usado para manter o rastreamento de diferentes navegadores.

Isso pode ser uma maneira eficaz de manter o rastreamento da sessão de session, mas cliques em links de hipertexto normais (<A HREF...>) não causam submissão de formulário, portanto, campos de formulário ocultos também não são compatíveis com o rastreamento de sessão de session normal.

Reescrevimento de URL

Você pode adicionar alguns dados adicionais no final de cada URL para identificar a sessão de session, e o servidor associará o identificador de sessão da session com os dados armazenados da sessão.

Por exemplo, http://oldtoolbag.com/file.htm;sessionid=12345O identificador de sessão da session é anexado como sessionid=12345O identificador pode ser acessado pelo servidor web para identificar o cliente.

A reescrevimento de URL é uma maneira melhor de manter a sessão de session, que funciona bem quando o navegador não suporta cookies, mas sua desvantagem é que cada URL é gerada dinamicamente para atribuir um ID de sessão da session à página, mesmo em páginas HTML estáticas simples.

Objeto HttpSession

Além dos três métodos mencionados acima, o Servlet também oferece a interface HttpSession, que fornece uma maneira de identificar o usuário e armazenar informações sobre o usuário ao navegar por várias páginas ou acessar o site.

O contêiner Servlet usa essa interface para criar uma sessão de session entre um cliente HTTP e um servidor HTTP. A sessão continua por um período de tempo especificado, em várias conexões ou solicitações de página.

Você pode fazer isso chamando o método público HttpServletRequest getSession()} para obter o objeto HttpSession, conforme mostrado a seguir:

HttpSession session = request.getSession();

Você precisa chamar isso antes de enviar qualquer conteúdo para o cliente. request.getSession()A seguir, resume-se alguns métodos importantes disponíveis no objeto HttpSession:

NúmeroMétodo & Descrição
1public Object getAttribute(String name)
Este método retorna o objeto com o nome especificado na sessão de session, ou null se não houver objeto com o nome especificado.
2public Enumeration getAttributeNames()
Este método retorna um enum de String que contém o nome de todos os objetos ligados ao session de session.
3public long getCreationTime()
Este método retorna o tempo, medido desde o horário de Greenwich Mean Time, em que a sessão de session foi criada. 1970 Ano 1 Mês 1 A partir do meio da noite, medido em milissegundos.
4public String getId()
Este método retorna uma string que contém um identificador único atribuído à sessão de session.
5public long getLastAccessedTime()
Este método retorna o tempo, medido desde o horário de Greenwich Mean Time, da última vez que o cliente enviou uma solicitação relacionada à sessão de session. 1970 Ano 1 Mês 1 A partir do meio da noite, medido em milissegundos.
6public int getMaxInactiveInterval()
Este método retorna o intervalo máximo de tempo, medido em segundos, que o container Servlet mantém a sessão de session aberta durante a visita do cliente.
7public void invalidate()
Este método indica que a sessão de session é inválida e desliga qualquer objeto vinculado a ela.
8public boolean isNew()
Se o cliente ainda não souber sobre a sessão de session ou se o cliente optar por não participar da sessão de session, este método retorna true.
9public void removeAttribute(String name)
Este método remove o objeto especificado do session de session.
10public void setAttribute(String name, Object value)
Este método liga um objeto ao session de session com o nome especificado.
11public void setMaxInactiveInterval(int interval)
Este método especifica o tempo entre solicitações do cliente, medido em segundos, antes de o container Servlet indicar que a sessão de session é inválida.

Exemplo de rastreamento de sessão

Este exemplo ilustra como usar o objeto HttpSession para obter o tempo de criação e a última visita da sessão. Se não existir uma sessão de session, criaremos uma nova sessão através da solicitação.

package com.w3codebox.test;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
 * Classe de implementação do Servlet SessionTrack
 */
@WebServlet("/SessionTrack)
public class SessionTrack extends HttpServlet {
    private static final long serialVersionUID = 1L;
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        // Se não existir uma sessão de session, será criado um objeto de sessão
        HttpSession session = request.getSession(true);
        // Obter o tempo de criação da sessão
        Date createTime = new Date(session.getCreationTime());
        // 获取该网页的最后一次访问时间
        Date lastAccessTime = new Date(session.getLastAccessedTime());
         
        //设置日期输出的格式  
        SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
    
        String title = "Servlet Session 示例 - 基础教程网";
        Integer visitCount = new Integer(0);
        String visitCountKey = new String("visitCount");
        String userIDKey = new String("userID");
        String userID = new String("w3codebox");
        if(session.getAttribute(visitCountKey) == null) {
            session.setAttribute(visitCountKey, new Integer(0));
        }
    
        // 检查网页上是否有新的访问者
        if (session.isNew()){
            title = "Servlet Session 示例 - 基础教程网";
             session.setAttribute(userIDKey, userID);
        } else {
             visitCount = (Integer)session.getAttribute(visitCountKey);
             visitCount = visitCount + 1;
             userID = (String)session.getAttribute(userIDKey);
        }
        session.setAttribute(visitCountKey, visitCount);
    
        // 设置响应内容类型
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
    
        String docType = "<!DOCTYPE html>\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\">Informações da sessão</h2>\n" +
                "<table border=\"1\" align=\"center\">\n" +
                "<tr bgcolor=\"#949494\">\n" +
                "  <th>Informações da sessão</th><th>Valor</th></tr>\n" +
                "<tr>\n" +
                "  <td>ID</td>\n" +
                "  <td>" + session.getId() + "</td></tr>\n" +
                "<tr>\n" +
                "  <td>Tempo de criação</td>\n" +
                "  <td>" +  df.format(createTime) + 
                "  </td></tr>\n" +
                "<tr>\n" +
                "  <td>Última vez de acesso</td>\n" +
                "  <td>" + df.format(lastAccessTime) + 
                "  </td></tr>\n" +
                "<tr>\n" +
                "  <td>ID do usuário </td>\n" +
                "  <td>" + userID + 
                "  </td></tr>\n" +
                "<tr>\n" +
                "  <td>Contagem de visitas:</td>\n" +
                "  <td>" + visitCount + "</td></tr>\n" +
                "</table>\n" +
                "</body></html>"); 
    }
}

Compile o Servlet acima SessionTracke crie uma entrada apropriada no arquivo web.xml.

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet> 
    <!-- Nome da classe -->  
    <servlet-name>SessionTrack</servlet-name>
    <!-- o pacote onde está localizado -->
    <servlet-class>com.w3codebox.test.SessionTrack</servlet-class>
  </servlet>
  <servlet-mapeamento>
    <servlet-name>SessionTrack</servlet-name>
    <!-- Endereço visitado -->
    <url-padrão>/TomcatTest/SessionTrack</url-padrão>
  </servlet-mapeamento>
</web-app>

Insira o endereço no campo de endereço do navegador http://localhost:8080/TomcatTest/SessionTrackao executar pela primeira vez, ele mostrará o seguinte resultado:

Tente novamente executar o mesmo Servlet, ele mostrará o seguinte resultado:

Excluir dados de sessão

Quando você concluiu os dados de sessão de um usuário, você tem as seguintes opções:

  • Remover um atributo específico:Você pode chamar public void removeAttribute(String name) método para excluir o valor associado a uma chave específica.

  • Excluir toda a sessão de sessão:Você pode chamar public void invalidate() método para descartar toda a sessão de sessão.

  • método para definir o tempo de expiração da sessão de sessão expirada:Você pode chamar public void setMaxInactiveInterval(int interval) método para definir o tempo de expiração da sessão de sessão individualmente.

  • deslogar o usuário:Se você usar um servlet que suportar 2.4 do servidor, você pode chamar logout para deslogar o cliente do servidor Web e tornar todas as sessões de todos os usuários inválidas.

  • Configuração web.xml:Se você usar o Tomcat, além dos métodos acima, você também pode configurar o tempo de expiração da sessão de sessão no arquivo web.xml, conforme mostrado a seguir:

  <session-config>
    <session-timeout>15</session-timeout>
  </session-config>

O tempo de expiração no exemplo acima é em minutos e substituirá o padrão padrão do Tomcat. 3tempo de expiração de 0 minutos.

O método getMaxInactiveInterval() em um Servlet retorna o tempo de expiração da sessão de sessão, em segundos. Portanto, se a configuração de tempo de expiração da sessão de sessão no web.xml for 15 minutos, então getMaxInactiveInterval() retornará 900。