Servlet Suivi de session

HTTP est un protocole « sans état », ce qui signifie que chaque fois qu'un client récupère une page web, le client ouvre une connexion distincte vers le serveur web, et le serveur ne conserve automatiquement aucun enregistrement des requêtes client précédentes.

Cependant, il existe encore les trois façons suivantes de maintenir la session entre un client web et un serveur web :

Cookies

Un serveur web peut attribuer un ID de session unique sous forme de cookie à chaque client web. Pour les requêtes ultérieures du client, le cookie reçu peut servir à l'identification.

Cela peut ne pas être une méthode efficace 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.

Champs de formulaire masqués

Un serveur web peut envoyer un champ de formulaire HTML caché avec un identifiant de session unique, comme montré ci-dessous :

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

Cette entrée signifie que lorsque le formulaire est soumis, le nom et la valeur spécifiés sont automatiquement inclus dans les données GET ou POST. Chaque fois que le navigateur web renvoie une requête, la valeur session_id peut être utilisée pour maintenir le suivi des différents navigateurs web.

Cela peut être un moyen efficace de maintenir le suivi de session, mais cliquer sur un lien hypertexte ordinaire (<A HREF...>) ne déclenche pas la soumission de formulaire, donc les champs de formulaire cachés ne prennent pas non plus en charge le suivi de session ordinaire.

Réécriture d'URL

Vous pouvez ajouter des données supplémentaires à la fin de chaque URL pour identifier la session, et le serveur associera l'identifiant de session aux données stockées liées à la session.

Par exemple, http://w3cschool.cc/file.htm;sessionid=12345, l'identifiant de session est ajouté sous la forme sessionid=12345, et l'identifiant peut être consulté par le serveur web pour identifier le client.

La réécriture d'URL est une meilleure façon de maintenir la session ; elle fonctionne bien lorsque les navigateurs ne prennent pas en charge les cookies, mais son inconvénient est qu'elle génère dynamiquement chaque URL pour attribuer un identifiant de session à la page, même pour des pages HTML statiques très simples.

Objet HttpSession

En plus des trois méthodes ci-dessus, Servlet fournit également l'interface HttpSession, qui offre un moyen d'identifier les utilisateurs à travers plusieurs requêtes de page ou visites de site web et de stocker des informations sur les utilisateurs.

Le conteneur Servlet utilise cette interface pour créer une session entre un client HTTP et un serveur HTTP. La session dure pendant une période spécifiée, sur plusieurs connexions ou requêtes de page.

Vous pouvez appeler la méthode publique de HttpServletRequestgetSession()pour obtenir l'objet HttpSession, comme montré ci-dessous :

HttpSession session = request.getSession();

Vous devez appeler ceci avant d’envoyer tout contenu de document au client.request.getSession()Ce qui suit résume plusieurs méthodes importantes disponibles dans l’objet HttpSession :

Non.Metode & Deskripsi
1public Object getAttribute(String name)
Cette méthode renvoie l’objet dont le nom spécifié est lié à cette session, ou renvoie null si aucun objet portant le nom spécifié n’existe.
2public Enumeration getAttributeNames()
Cette méthode renvoie une énumération d’objets String ; les objets String contiennent les noms de tous les objets liés à cette session.
3public long getCreationTime()
Cette méthode renvoie l’heure à laquelle cette session a été créée, mesurée en millisecondes depuis minuit le 1er janvier 1970, heure moyenne de Greenwich.
4public String getId()
Cette méthode renvoie une chaîne contenant l’identifiant unique attribué à cette session.
5public long getLastAccessedTime()
Cette méthode renvoie l’heure à laquelle le client a envoyé pour la dernière fois une requête associée à cette session, mesurée en millisecondes depuis minuit le 1er janvier 1970, heure moyenne de Greenwich.
6public int getMaxInactiveInterval()
Cette méthode renvoie l’intervalle de temps maximal, en secondes, pendant lequel le conteneur Servlet garde la session ouverte lors de l’accès du client.
7public void invalidate()
Cette méthode invalide cette session et dissocie tous les objets qui y sont liés.
8public boolean isNew()
Cette méthode renvoie true si le client ne connaît pas encore cette session, ou si le client choisit de ne pas participer à cette session.
9public void removeAttribute(String name)
Cette méthode supprime de cette session l'objet portant le nom spécifié.
10public void setAttribute(String name, Object value)
Cette méthode lie un objet à cette session en utilisant le nom spécifié.
11public void setMaxInactiveInterval(int interval)
Cette méthode spécifie le délai, en secondes, entre les requêtes client avant que le conteneur de servlets n'invalide cette session.

Exemple de suivi de session

Cet exemple montre comment utiliser l'objet HttpSession pour obtenir l'heure de création de la session et l'heure du dernier accès. Si la session n'existe pas, nous créons une nouvelle session via la requête.

package com.example.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;

/**
 * Servlet implementation class SessionTrack
 */
@WebServlet("/SessionTrack")
public class SessionTrack extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        // 如果不存在 session 会话,则创建一个 session 对象
        HttpSession session = request.getSession(true);
        // 获取 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 实例 - Example";
        Integer visitCount = new Integer(0);
        String visitCountKey = new String("visitCount");
        String userIDKey = new String("userID");
        String userID = new String("Example");
        if(session.getAttribute(visitCountKey) == null) {
            session.setAttribute(visitCountKey, new Integer(0));
        }

    
        // 检查网页上是否有新的访问者
        if (session.isNew()){
            title = "Servlet Session 实例 - Example";
             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>Session 信息</th><th>值</th></tr>\n" +
                "<tr>\n" +
                "  <td>id</td>\n" +
                "  <td>" + session.getId() + "</td></tr>\n" +
                "<tr>\n" +
                "  <td>创建时间</td>\n" +
                "  <td>" +  df.format(createTime) + 
                "  </td></tr>\n" +
                "<tr>\n" +
                "  <td>最后访问时间</td>\n" +
                "  <td>" + df.format(lastAccessTime) + 
                "  </td></tr>\n" +
                "<tr>\n" +
                "  <td>用户 ID</td>\n" +
                "  <td>" + userID + 
                "  </td></tr>\n" +
                "<tr>\n" +
                "  <td>访问统计:</td>\n" +
                "  <td>" + visitCount + "</td></tr>\n" +
                "</table>\n" +
                "</body></html>"); 
    }
}

Compilez la servlet ci-dessusSessionTracket créez une entrée appropriée dans le fichier web.xml.

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet> 
    <!-- 类名 -->  
    <servlet-name>SessionTrack</servlet-name>
    <!-- 所在的包 -->
    <servlet-class>com.example.test.SessionTrack</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>SessionTrack</servlet-name>
    <!-- 访问的网址 -->
    <url-pattern>/TomcatTest/SessionTrack</url-pattern>
  </servlet-mapping>
</web-app>

Saisissez ceci dans la barre d'adresse du navigateurhttp://localhost:8080/TomcatTest/SessionTrackLors de la première exécution, le résultat suivant s'affiche :

Essayez d'exécuter à nouveau la même Servlet, et elle affichera le résultat suivant :


Suppression des données de session

Lorsque vous avez terminé avec les données de session d'un utilisateur, vous disposez des options suivantes :

  • Supprimer un attribut spécifique :Vous pouvez appeler lapublic void removeAttribute(String name)méthode pour supprimer la valeur associée à une clé spécifique.
  • Supprimer toute la session :Vous pouvez appeler lapublic void invalidate()méthode pour abandonner toute la session.
  • Définir le délai d'expiration de session :Vous pouvez appeler lapublic void setMaxInactiveInterval(int interval)méthode pour définir individuellement le délai d'expiration de session.
  • Déconnecter l'utilisateur :Si vous utilisez un serveur qui prend en charge Servlet 2.4, vous pouvez appelerlogoutpour déconnecter le client du serveur Web et définir toutes les sessions de tous les utilisateurs comme non valides.
  • Configuration de web.xml :Si vous utilisez Tomcat, en plus des méthodes ci-dessus, vous pouvez également configurer le délai d'expiration de session dans le fichier web.xml, comme indiqué ci-dessous :
  <session-config>
    <session-timeout>15</session-timeout>
  </session-config>

Le délai d'expiration dans l'exemple ci-dessus est en minutes et remplacera le délai d'expiration par défaut de 30 minutes dans Tomcat.

La méthode getMaxInactiveInterval() dans une Servlet renvoie le délai d'expiration de session en secondes. Par conséquent, si vous configurez le délai d'expiration de session sur 15 minutes dans web.xml, getMaxInactiveInterval() renverra 900.

Autres extensions