HTTP est un protocole sans état, ce qui signifie que chaque fois qu'un client récupère une page Web, une connexion serveur distincte est ouverte, de sorte que le serveur n'enregistre aucune information provenant des demandes précédentes du client.
Il existe trois manières de maintenir une session client-serveur :
Un serveur Web peut attribuer un ID de session unique en tant que cookie pour représenter chaque client et identifier les demandes ultérieures de ce client.
Ce n'est peut-être pas une méthode efficace, car bien souvent les navigateurs ne prennent pas nécessairement en charge les cookies, nous ne recommandons donc pas d'utiliser cette méthode pour maintenir la session.
Un serveur Web peut envoyer un champ de formulaire HTML masqué et un identifiant de session unique, comme ceci :
<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 seront automatiquement inclus dans les données GET ou POST. Chaque fois que le navigateur envoie une requête, la valeur de session_id peut être utilisée pour enregistrer les traces des différents navigateurs.
Cette approche peut être efficace, mais cliquer sur un lien hypertexte dans une balise <A HREF> ne génère pas d'événement de soumission de formulaire, donc les champs de formulaire masqués ne prennent pas en charge le suivi de session universel.
Vous pouvez ajouter des données supplémentaires après chaque URL pour distinguer la session, et le serveur peut associer l'identifiant de session en fonction de ces données.
Par exemple, http://w3cschool.cn/file.htm;sessionid=12345, l'identifiant de session est sessionid=12345, le serveur peut utiliser ces données pour identifier le client.
En comparaison, réécrire l'URL est une meilleure méthode, et cela fonctionnera même si le navigateur ne prend pas en charge les cookies, mais l'inconvénient est que vous devez spécifier dynamiquement l'ID de session pour chaque URL, même s'il s'agit d'une simple page HTML.
En plus des méthodes ci-dessus, JSP utilise l'interface HttpSession fournie par le servlet pour identifier un utilisateur et stocker toutes les informations d'accès de cet utilisateur.
Par défaut, JSP autorise le suivi de session et un nouvel objet HttpSession sera automatiquement instancié pour les nouveaux clients. La désactivation du suivi de session nécessite de le désactiver explicitement, ce qui est réalisé en définissant la valeur de l'attribut de session dans la directive page sur false, comme suit :
<%@page session="false" %>
Le moteur JSP expose l'objet de session sous-jacent aux développeurs. Puisque l'objet session est fourni, les développeurs peuvent facilement stocker ou récupérer des données.
Le tableau suivant répertorie certaines méthodes importantes de l'objet session :
SN | Méthode et description |
---|---|
1 | public Object getAttribute(String name) renvoie l'objet lié au nom spécifié dans l'objet de session, ou null s'il n'existe pas. |
2 | L'énumération publique getAttributeNames() renvoie tous les noms d'objet dans l'objet de session |
3 | public long getCreationTime() renvoie l'heure à laquelle l'objet de session a été créé, en millisecondes, à partir du petit matin du 1er janvier 1970 |
4 | public String getId() renvoie l'ID de l'objet de session |
5 | public long getLastAccessedTime() renvoie l'heure du dernier accès du client, en millisecondes, à partir du petit matin du 1er janvier 1970 |
6 | public int getMaxInactiveInterval() renvoie l'intervalle de temps maximum, en secondes, pendant lequel le conteneur de servlet gardera la session ouverte |
7 | public void invalidate() invalide la session et dissocie tous les objets liés à la session. |
8 | public boolean isNew( renvoie s'il s'agit d'un nouveau client ou si le client refuse de rejoindre la session |
9 | public void removeAttribute(String name) supprime l'objet portant le nom spécifié dans la session |
10 | public void setAttribute (String name, Object value) utilise le nom et la valeur spécifiés pour générer un objet et le lier à la session |
11 | public void setMaxInactiveInterval(int interval) est utilisé pour spécifier la durée, en secondes, pendant laquelle le conteneur de servlet maintiendra la session valide. |
Cet exemple décrit comment utiliser l'objet HttpSession pour obtenir l'heure de création et l'heure du dernier accès. Nous associerons un nouvel objet session à l'objet requête s'il n'existe pas déjà.
<%@ page import="java.io.*,java.util.*" %><% // Récupère l'heure de création de la session Date createTime = new Date(session.getCreationTime()); dernière page visitée Date lastAccessTime = new Date(session.getLastAccessedTime()); String title = "Bienvenue sur mon site Web"; new String("visitCount"); String userIDKey = new String("userID"); String userID = new String("ABCD"); // Vérifiez si la page Web est visitée par un nouvel utilisateur if (session.isNew()) ){ title = "Bienvenue sur mon site Web" ; session.setAttribute(userIDKey, userID); session.setAttribute(visitCountKey, visitCount } visitCount ); (Integer)session.getAttribute(visitCountKey); visitCount = visitCount + 1; userID = (String)session.getAttribute(userIDKey); session.setAttribute(visitCountKey, visitCount); </title></head><body><center><h1>Suivi de session</h1></center><table align="center"> <tr bgcolor="#949494"> <th>Informations sur la session</th> <th>Valeur</th></tr> <tr> <td>id</td> <td><% out.print( session. getId() ); %></td></tr> <tr> <td>Heure de création</td> <td><% out.print (createTime) %></td></tr> < tr> <td>Heure du dernier accès</td> <td><% out.print(lastAccessTime); %></td></tr> <tr> <td>ID utilisateur</td> <td><% out.print(userID); %></td></tr> <tr> <td>Nombre de visites</td> <td><% out.print(visitCount %></td></); tr> </table> </body></html>
Essayez d'accéder à http://localhost:8080/main.jsp Les résultats suivants seront obtenus lors de la première exécution :
Revenez et vous obtiendrez les résultats suivants :
Après avoir traité les données de session d'un utilisateur, vous disposez des options suivantes :
Supprimez un attribut spécifique :
Appelez la méthode public void removeAttribute(String name) pour supprimer l’attribut spécifié.
Supprimez toute la session :
Appelez la méthode public void invalidate() pour invalider toute la session.
Définir la durée de validité de la session :
Appelez la méthode public void setMaxInactiveInterval(int interval) pour définir le délai d'expiration de la session.
Déconnexion de l'utilisateur :
Les serveurs prenant en charge la version 2.4 du servlet peuvent appeler la méthode logout() pour déconnecter l'utilisateur et invalider toutes les sessions associées.
Configurez le fichier web.xml :
Si vous utilisez Tomcat, vous pouvez configurer le fichier web.xml comme suit :
<session-config> <session-timeout>15</session-timeout> </session-config>
Le délai d'expiration est en minutes et le délai d'expiration par défaut dans Tomcat est de 30 minutes.
La méthode getMaxInactiveInterval() de Servlet renvoie le délai d'attente en secondes. Si 15 minutes sont configurées dans web.xml, la méthode getMaxInactiveInterval() renverra 900.