Servlets - 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 au serveur Web et le serveur ne conserve automatiquement aucun enregistrement de la demande client précédente.
Il existe toujours trois façons de maintenir la session entre le client Web et le serveur Web -
Biscuits
Un serveur Web peut attribuer un identifiant de session unique en tant que cookie à chaque client Web et pour les demandes ultérieures du client, il peut être reconnu à l'aide du cookie reçu.
Cela peut ne pas être un moyen efficace car le navigateur de nombreuses fois ne prend pas en charge un cookie, donc je ne recommanderais pas d'utiliser cette procédure pour maintenir les sessions.
Champs de formulaire masqués
Un serveur Web peut envoyer un champ de formulaire HTML masqué avec un ID de session unique comme suit -
<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 la demande, la valeur session_id peut être utilisée pour garder la trace des différents navigateurs Web.
Cela pourrait être un moyen efficace de garder une trace de la session, mais le fait de cliquer sur un lien hypertexte régulier (<A HREF...>) n'entraîne pas l'envoi d'un formulaire, de sorte que les champs de formulaire masqués ne peuvent pas non plus prendre en charge le suivi général de la session.
Réécriture d'URL
Vous pouvez ajouter des données supplémentaires à la fin de chaque URL qui identifie la session, et le serveur peut associer cet identificateur de session aux données qu'il a stockées sur cette session.
Par exemple, avec http://tutorialspoint.com/file.htm;sessionid = 12345, l'identifiant de session est attaché sous la forme sessionid = 12345 qui peut être consulté sur le serveur Web pour identifier le client.
La réécriture d'URL est un meilleur moyen de maintenir les sessions et cela fonctionne même lorsque les navigateurs ne prennent pas en charge les cookies. L'inconvénient de la réécriture d'URL est que vous devrez générer chaque URL dynamiquement pour attribuer un ID de session, même dans le cas d'une simple page HTML statique.
L'objet HttpSession
Outre les trois méthodes mentionnées ci-dessus, le servlet fournit une interface HttpSession qui permet d'identifier un utilisateur à travers plus d'une demande de page ou de visiter un site Web et de stocker des informations sur cet utilisateur.
Le conteneur de servlet utilise cette interface pour créer une session entre un client HTTP et un serveur HTTP. La session persiste pendant une période de temps spécifiée, sur plus d'une connexion ou demande de page de l'utilisateur.
Vous obtiendrez l'objet HttpSession en appelant la méthode publique getSession() de HttpServletRequest, comme ci-dessous -
HttpSession session = request.getSession();
Vous devez appeler request.getSession () avant d'envoyer un contenu de document au client. Voici un résumé des méthodes importantes disponibles via l'objet HttpSession -
Sr.No. | Méthode et description |
---|---|
1 | public Object getAttribute(String name) Cette méthode renvoie l'objet lié avec le nom spécifié dans cette session, ou null si aucun objet n'est lié sous le nom. |
2 | public Enumeration getAttributeNames() Cette méthode retourne une énumération d'objets String contenant les noms de tous les objets liés à cette session. |
3 | public long getCreationTime() Cette méthode renvoie l'heure à laquelle cette session a été créée, mesurée en millisecondes depuis le 1er janvier 1970 à minuit GMT. |
4 | public String getId() Cette méthode renvoie une chaîne contenant l'identifiant unique attribué à cette session. |
5 | public long getLastAccessedTime() Cette méthode renvoie l'heure du dernier accès de la session, au format de millisecondes depuis minuit le 1er janvier 1970 GMT |
6 | public int getMaxInactiveInterval() Cette méthode renvoie l'intervalle de temps maximal (secondes) pendant lequel le conteneur de servlet maintiendra la session ouverte entre les accès client. |
sept | public void invalidate() Cette méthode invalide cette session et dissocie tous les objets qui y sont liés. |
8 | public boolean isNew( Cette méthode renvoie true si le client ne connaît pas encore la session ou si le client choisit de ne pas rejoindre la session. |
9 | public void removeAttribute(String name) Cette méthode supprime l'objet lié avec le nom spécifié de cette session. |
dix | public void setAttribute(String name, Object value) Cette méthode lie un objet à cette session, en utilisant le nom spécifié. |
11 | public void setMaxInactiveInterval(int interval) Cette méthode spécifie le temps, en secondes, entre les demandes du client avant que le conteneur de servlet n'invalide cette session. |
Exemple de suivi de session
Cet exemple décrit comment utiliser l'objet HttpSession pour connaître l'heure de création et l'heure du dernier accès d'une session. Nous associerions une nouvelle session à la demande s'il n'en existe pas déjà une.
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
// Extend HttpServlet class
public class SessionTrack extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Create a session object if it is already not created.
HttpSession session = request.getSession(true);
// Get session creation time.
Date createTime = new Date(session.getCreationTime());
// Get last access time of this web page.
Date lastAccessTime = new Date(session.getLastAccessedTime());
String title = "Welcome Back to my website";
Integer visitCount = new Integer(0);
String visitCountKey = new String("visitCount");
String userIDKey = new String("userID");
String userID = new String("ABCD");
// Check if this is new comer on your web page.
if (session.isNew()) {
title = "Welcome to my website";
session.setAttribute(userIDKey, userID);
} else {
visitCount = (Integer)session.getAttribute(visitCountKey);
visitCount = visitCount + 1;
userID = (String)session.getAttribute(userIDKey);
}
session.setAttribute(visitCountKey, visitCount);
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " +
"transitional//en\">\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 Infomation</h2>\n" +
"<table border = \"1\" align = \"center\">\n" +
"<tr bgcolor = \"#949494\">\n" +
" <th>Session info</th><th>value</th>
</tr>\n" +
"<tr>\n" +
" <td>id</td>\n" +
" <td>" + session.getId() + "</td>
</tr>\n" +
"<tr>\n" +
" <td>Creation Time</td>\n" +
" <td>" + createTime + " </td>
</tr>\n" +
"<tr>\n" +
" <td>Time of Last Access</td>\n" +
" <td>" + lastAccessTime + " </td>
</tr>\n" +
"<tr>\n" +
" <td>User ID</td>\n" +
" <td>" + userID + " </td>
</tr>\n" +
"<tr>\n" +
" <td>Number of visits</td>\n" +
" <td>" + visitCount + "</td>
</tr>\n" +
"</table>\n" +
"</body>
</html>"
);
}
}
Compilez le servlet ci-dessus SessionTracket créez l'entrée appropriée dans le fichier web.xml. Maintenant, exécutez http: // localhost: 8080 / SessionTrack afficherait le résultat suivant lorsque vous exécuteriez pour la première fois -
Welcome to my website
Session Infomation
Session info
value
id
0AE3EC93FF44E3C525B4351B77ABB2D5
Creation Time
Tue Jun 08 17:26:40 GMT+04:00 2010
Time of Last Access
Tue Jun 08 17:26:40 GMT+04:00 2010
User ID
ABCD
Number of visits
0
Maintenant, essayez d'exécuter le même servlet pour la deuxième fois, il afficherait le résultat suivant.
Welcome Back to my website
Session Infomation
info type
value
id
0AE3EC93FF44E3C525B4351B77ABB2D5
Creation Time
Tue Jun 08 17:26:40 GMT+04:00 2010
Time of Last Access
Tue Jun 08 17:26:40 GMT+04:00 2010
User ID
ABCD
Number of visits
1
Suppression des données de session
Lorsque vous avez terminé avec les données de session d'un utilisateur, vous avez plusieurs options -
Remove a particular attribute- Vous pouvez appeler la méthode publique void removeAttribute (String name) pour supprimer la valeur associée à une clé particulière.
Delete the whole session- Vous pouvez appeler la méthode public void invalidate () pour supprimer une session entière.
Setting Session timeout- Vous pouvez appeler la méthode publique void setMaxInactiveInterval (intervalle int) pour définir le délai d'expiration d'une session individuellement.
Log the user out - Les serveurs prenant en charge les servlets 2.4, vous pouvez appeler logout pour déconnecter le client du serveur Web et invalider toutes les sessions appartenant à tous les utilisateurs.
web.xml Configuration - Si vous utilisez Tomcat, en dehors des méthodes mentionnées ci-dessus, vous pouvez configurer le délai d'expiration de session dans le fichier web.xml comme suit.
<session-config>
<session-timeout>15</session-timeout>
</session-config>
Le délai d'expiration est exprimé en minutes et remplace le délai d'expiration par défaut qui est de 30 minutes dans Tomcat.
La méthode getMaxInactiveInterval () dans un servlet renvoie le délai d'expiration de cette session en secondes. Donc, si votre session est configurée dans web.xml pendant 15 minutes, getMaxInactiveInterval () renvoie 900.