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

Suivi de session Servlet

HTTP est un protocole "sans état", ce qui signifie que chaque fois que le client récupère une page web, il ouvre une connexion distincte vers le serveur Web, et le serveur n'enregistre automatiquement aucune trace des demandes précédentes du client.

Mais il existe toujours trois méthodes pour maintenir la session de communication entre le client Web et le serveur Web :

Cookies

Un serveur web peut attribuer un ID de session de session unique comme cookie pour chaque client web, et pour les requêtes suivantes du client, les cookies reçus peuvent être utilisés pour identifier.

Ce peut ne pas être une méthode valide, car de nombreux navigateurs ne prennent pas en charge les cookies, donc nous recommandons de ne pas utiliser cette méthode pour maintenir la session de session.

Champ de formulaire caché

Un serveur web peut envoyer un champ de formulaire HTML caché ainsi qu'un ID de session de session unique, comme suit :

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

Cette entrée signifie que lorsque le formulaire est soumis, les noms et valeurs spécifiés sont automatiquement inclus dans les données GET ou POST. Chaque fois que le navigateur web envoie une requête de retour, la valeur session_id peut être utilisée pour suivre différemment les navigateurs web.

Cela peut être un moyen efficace de maintenir le suivi de la session de session, mais le clic sur un lien hypertexte conventionnel (<A HREF...>) ne provoquera pas de soumission de formulaire, par conséquent, les champs de formulaire cachés ne prennent pas en charge le suivi de session de session conventionnel.

URL rewriting

Vous pouvez ajouter des données supplémentaires à la fin de chaque URL pour identifier la session de session, et le serveur associera cette identificateur de session de session à des données stockées concernant la session de session.

Par exemple, http://oldtoolbag.com/file.htm;sessionid=12345L'identificateur de session de session est ajouté sous la forme de sessionid=12345L'identificateur peut être accessible par le serveur web pour identifier le client.

L'URL rewriting est une meilleure manière de maintenir la session de session, qui fonctionne bien lorsque le navigateur ne prend pas en charge les cookies, mais son inconvénient est qu'il génère dynamiquement chaque URL pour attribuer un ID de session de session à la page, même pour des pages HTML statiques simples.

Objet HttpSession

En plus des trois méthodes mentionnées précédemment, Servlet fournit également l'interface HttpSession, qui fournit un moyen de reconnaître l'utilisateur et de stocker des informations sur l'utilisateur lors de la navigation sur plusieurs pages ou lors de l'accès au site web.

Le conteneur Servlet utilise cette interface pour créer une session de session entre un client HTTP et un serveur HTTP. La session dure un certain temps spécifié, sur plusieurs connexions ou demandes de pages.

Vous pouvez appeler la méthode publique HttpServletRequest getSession()} pour obtenir l'objet HttpSession, comme suit :

HttpSession session = request.getSession();

Vous devez appeler cette méthode avant d'envoyer tout contenu au client. request.getSession()Voici une synthèse des méthodes importantes disponibles dans l'objet HttpSession :

NuméroMéthode & Description
1public Object getAttribute(String name)
Cette méthode retourne l'objet ayant le nom spécifié dans la session actuelle, ou null s'il n'y a pas d'objet spécifié.
2public Enumeration getAttributeNames()
Cette méthode retourne un ensemble de chaînes qui contient les noms de tous les objets liés à la session.
3public long getCreationTime()
Cette méthode retourne le temps où la session a été créée, à partir du temps universel moyen (GMT). 1970 an 1 mois 1 à minuit, en millisecondes.
4public String getId()
Cette méthode retourne une chaîne contenant un identifiant unique attribué à la session.
5public long getLastAccessedTime()
Cette méthode retourne le temps, à partir du temps universel moyen (GMT), où le client a envoyé pour la dernière fois une demande liée à la session. 1970 an 1 mois 1 à minuit, en millisecondes.
6public int getMaxInactiveInterval()
Cette méthode retourne le temps maximum que le conteneur Servlet peut maintenir la session ouverte lors de l'accès du client, en secondes.
7public void invalidate()
Cette méthode indique que la session est non valide et désactive toute liaison d'objet attachée à elle.
8public boolean isNew()
Cette méthode retourne true si le client ne connaît pas encore la session ou si le client choisit de ne pas participer à la session.
9public void removeAttribute(String name)
Cette méthode supprime l'objet spécifié de la session actuelle.
10public void setAttribute(String name, Object value)
Cette méthode lie un objet à la session actuelle en utilisant le nom spécifié.
11public void setMaxInactiveInterval(int interval)
Cette méthode spécifie le temps entre les demandes client, en secondes, avant que le conteneur Servlet ne declare la session non valide.

Exemple de suivi de session

Ce exemple explique comment utiliser l'objet HttpSession pour obtenir le temps de création et la dernière heure d'accès de la session. Si la session n'existe pas, nous créerons une nouvelle session via la requête.

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 d'implémentation 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
    {
        // Si la session n'existe pas, créer un objet session
        HttpSession session = request.getSession(true);
        // Obtenir le temps de création de session
        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\">Session 信息</h2>\n" +
                "<table border=\"1\" align=\"center\">\n" +
                "<tr bgcolor=\"#949494\">\n" +
                "  <th>Informations de session</th><th>Valeur</th></tr>\n" +
                "<tr>\n" +
                "  <td>id</td>\n" +
                "  <td>" + session.getId() + "</td></tr>\n" +
                "<tr>\n" +
                "  <td>Heure de création</td>\n" +
                "  <td>" +  df.format(createTime) + 
                "  </td></tr>\n" +
                "<tr>\n" +
                "  <td>Dernière heure d'accès</td>\n" +
                "  <td>" + df.format(lastAccessTime) + 
                "  </td></tr>\n" +
                "<tr>\n" +
                "  <td>Utilisateur ID</td>\n" +
                "  <td>" + userID + 
                "  </td></tr>\n" +
                "<tr>\n" +
                "  <td>Statistiques d'accès : </td>\n" +
                "  <td>" + visitCount + "</td></tr>\n" +
                "</table>\n" +
                "</body></html>"); 
    }
}

Compiler le Servlet ci-dessus SessionTrack, et créez une entrée appropriée dans le fichier web.xml.

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet> 
    <!-- nom de la classe -->  
    <servlet-name>SessionTrack</servlet-name>
    <!-- le paquet où il se trouve -->
    <servlet-class>com.w3codebox.test.SessionTrack</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>SessionTrack</servlet-name>
    <!-- L'adresse du site visité -->
    <url-pattern>/TomcatTest/SessionTrack</url-pattern>
  </servlet-mapping>
</web-app>

Entrez l'adresse du site dans la barre d'adresse du navigateur http://localhost:8080/TomcatTest/SessionTrackLorsque vous exécutez pour la première fois, le résultat suivant s'affichera :

Tentez à nouveau d'exécuter le même Servlet, il affichera le résultat suivant :

Supprimer les données de session

Lorsque vous avez terminé les données de session d'un utilisateur, vous avez plusieurs choix :

  • Supprimer une propriété spécifique :Vous pouvez appeler public void removeAttribute(String name) méthode pour supprimer la valeur associée à une clé spécifique.

  • Supprimer l'ensemble de la session :Vous pouvez appeler public void invalidate() méthode pour supprimer l'ensemble de la session.

  • pour définir le temps d'expiration de la session.Vous pouvez appeler public void setMaxInactiveInterval(int interval) méthode pour définir individuellement le temps d'expiration de la session.

  • Se déconnecter de l'utilisateur :si vous utilisez un serveur qui prend en charge servlet 2.4 du serveur, vous pouvez appeler logout pour se déconnecter du client Web serveur et rendre toutes les sessions de tous les utilisateurs non valides.

  • Configuration web.xml :Si vous utilisez Tomcat, en plus des méthodes ci-dessus, vous pouvez configurer le temps d'expiration de la session dans le fichier web.xml comme suit :

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

Le temps d'expiration de l'exemple ci-dessus est en minutes et remplacera le temps d'expiration par défaut de Tomcat. 3temps d'expiration de 0 minute.

La méthode getMaxInactiveInterval() dans un Servlet retourne le temps d'expiration de la session, en secondes. Donc, si le temps d'expiration de la session est configuré à 15 si getMaxInactiveInterval() retournera 900。