Suivi des sessions de servlets


HTTP est un protocole "sans état", ce qui signifie que chaque fois que le client récupère une page Web, le client ouvre une connexion distincte au serveur Web, et le serveur ne conserve automatiquement pas le client précédent demander des enregistrements.

Mais il existe encore trois manières de maintenir la session entre le client web et le serveur web :

Cookies

Un serveur Web peut attribuer un identifiant de session unique en tant que cookie à chaque client Web, et les demandes ultérieures du client peuvent être identifiées à l'aide du cookie reçu.

Ce n'est peut-être pas une méthode efficace car de nombreux navigateurs ne prennent pas en charge les cookies, nous vous déconseillons donc d'utiliser cette méthode pour maintenir la session.

Champ de formulaire masqué

Un serveur Web peut envoyer un champ de formulaire HTML masqué, accompagné d'un identifiant de session unique, comme suit :

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

Cette entrée signifie Ensuite, lorsque le formulaire est soumis, le nom et la valeur spécifiés sont automatiquement inclus dans les données GET ou POST. La valeur session_id peut être utilisée pour suivre différents navigateurs Web chaque fois que le navigateur Web renvoie une demande.

Cela peut être un moyen efficace de garder une trace de la session, mais cliquer sur un lien hypertexte classique (<A HREF...>) n'entraînera pas la soumission du formulaire, donc le formulaire masqué non plus. champs. Prend en charge le suivi de session régulier.

Réécriture d'URL

Vous pouvez ajouter des données supplémentaires à la fin de chaque URL pour identifier la session, et le serveur corrélera l'identifiant de session avec les données stockées sur l'Union.

Par exemple, http://w3cschool.cc/file.htm;sessionid=12345, l'identifiant de session est ajouté comme sessionid=12345, et l'identifiant est accessible par le serveur Web pour identifier le client.

La réécriture d'URL est un meilleur moyen de maintenir la session. Elle fonctionne bien lorsque le navigateur ne prend pas en charge les cookies, mais son inconvénient est que chaque URL est générée dynamiquement pour attribuer même un identifiant de session à la page. dans des pages HTML statiques très simples.

Objet HttpSession

En plus des trois méthodes ci-dessus, Servlet fournit également l'interface HttpSession, qui permet d'identifier les utilisateurs et de stocker des informations sur les utilisateurs sur plusieurs requêtes de pages ou lors de l'accès à des sites Web. chemin.

Le conteneur Servlet utilise cette interface pour créer une session entre un client HTTP et un serveur HTTP. Une session dure une période de temps spécifiée et s'étend sur plusieurs connexions ou demandes de pages.

Vous obtiendrez l'objet HttpSession en appelant la méthode publique getSession() de HttpServletRequest, comme indiqué ci-dessous :

HttpSession session = request.getSession();

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

序号方法 & 描述
1public Object getAttribute(String name)
该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null。
2public Enumeration getAttributeNames()
该方法返回 String 对象的枚举,String 对象包含所有绑定到该 session 会话的对象的名称。
3public long getCreationTime()
该方法返回该 session 会话被创建的时间,自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。
4public String getId()
该方法返回一个包含分配给该 session 会话的唯一标识符的字符串。
5public long getLastAccessedTime()
该方法返回客户端最后一次发送与该 session 会话相关的请求的时间自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。
6public int getMaxInactiveInterval()
该方法返回 Servlet 容器在客户端访问时保持 session 会话打开的最大时间间隔,以秒为单位。
7public void invalidate()
该方法指示该 session 会话无效,并解除绑定到它上面的任何对象。
8public boolean isNew(
如果客户端还不知道该 session 会话,或者如果客户选择不参入该 session 会话,则该方法返回 true。
9public void removeAttribute(String name)
该方法将从该 session 会话移除指定名称的对象。
10public void setAttribute(String name, Object value)
该方法使用指定的名称绑定一个对象到该 session 会话。
11public void setMaxInactiveInterval(int interval)
该方法在 Servlet 容器指示该 session 会话无效之前,指定客户端请求之间的时间,以秒为单位。

Exemple de suivi de session

Cet exemple illustre comment utiliser l'objet HttpSession pour obtenir l'heure de création de session et l'heure du dernier accès. Si la session n'existe pas, nous en créerons une nouvelle avec la demande.

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
 
// 扩展 HttpServlet 类
public class SessionTrack extends HttpServlet {
 
  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());

      String title = "欢迎回到我的网站";
      Integer visitCount = new Integer(0);
      String visitCountKey = new String("visitCount");
      String userIDKey = new String("userID");
      String userID = new String("ABCD");

      // 检查网页上是否有新的访问者
      if (session.isNew()){
         title = "欢迎来到我的网站";
         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");
      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 信息</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>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>");
  }
}

Compile le servlet ci-dessus SessionTrack et crée les entrées appropriées dans le fichier web.xml. Entrez http://localhost:8080/SessionTrack dans la barre d'adresse du navigateur Lorsque vous l'exécutez pour la première fois, les résultats suivants s'afficheront :

Bienvenue sur mon. site Web

Informations sur la session

Session 信息
id0AE3EC93FF44E3C525B4351B77ABB2D5
Creation TimeTue Jun 08 17:26:40 GMT+04:00 2014
Time of Last AccessTue Jun 08 17:26:40 GMT+04:00 2014
User IDABCD
Number of visits0

Essayez d'exécuter à nouveau le même servlet, il affichera les résultats suivants :

Bienvenue sur mon site Web

Informations sur la séance

Session 信息
id0AE3EC93FF44E3C525B4351B77ABB2D5
Creation TimeTue Jun 08 17:26:40 GMT+04:00 2014
Time of Last AccessTue Jun 08 17:26:40 GMT+04:00 2014
User IDABCD
Number of visits1

Supprimer les données de session

Lorsque vous complétez les données de session d'un utilisateur, vous disposez des options suivantes :

  • Supprimer un élément spécifique attribut : Vous pouvez appeler la méthode public void removeAttribute(String name) pour supprimer la valeur associée à une clé spécifique. pour supprimer la valeur associée à une clé particulière.

  • Supprimer toute la session : Vous pouvez appeler la méthode public void invalidate() pour rejeter toute la session.

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

  • Déconnectez l'utilisateur : Si vous utilisez un serveur prenant en charge le servlet 2.4, vous pouvez appeler logout pour déconnecter le client de le serveur web, et Invalider toutes les sessions appartenant à tous les utilisateurs.

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

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

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

La méthode getMaxInactiveInterval() dans un Servlet renverra le délai d'expiration de la session, en secondes. Ainsi, si le délai d'expiration de la session est configuré dans web.xml sur 15 minutes, getMaxInactiveInterval() renverra 900.