English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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:
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.
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.
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.
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úmero | Método & Descrição |
---|---|
1 | public 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. |
2 | public Enumeration getAttributeNames() Este método retorna um enum de String que contém o nome de todos os objetos ligados ao session de session. |
3 | public 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. |
4 | public String getId() Este método retorna uma string que contém um identificador único atribuído à sessão de session. |
5 | public 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. |
6 | public 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. |
7 | public void invalidate() Este método indica que a sessão de session é inválida e desliga qualquer objeto vinculado a ela. |
8 | public 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. |
9 | public void removeAttribute(String name) Este método remove o objeto especificado do session de session. |
10 | public void setAttribute(String name, Object value) Este método liga um objeto ao session de session com o nome especificado. |
11 | public 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. |
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:
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。