Latest web development tutorials

Servlet Suivi de session

HTTP est un protocole «apatride», ce qui signifie que chaque fois que le client récupère les pages, le client ouvre une connexion distincte au serveur Web, le serveur n'enregistre pas automatiquement avant que les demandes des clients sont réservés.

Mais il y a encore trois façons de maintenir la session conversation entre le client Web et le serveur Web:

cookies

Un serveur Web peut être affecté un ID de session unique que la session pour chaque client cookie Web, les demandes suivantes pour le client peuvent être utilisés pour identifier le cookie reçu.

Cela peut ne pas être une méthode efficace, parce que beaucoup de navigateurs ne supportent pas cookies, donc nous ne recommandons pas d'utiliser ce moyen de maintenir la session de la session.

champs de formulaire cachés

Un serveur Web peut envoyer un cachés champs de formulaire HTML, ainsi qu'un identifiant unique de session de la session, comme suit:

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

Cette entrée signifie que lorsque le formulaire est soumis, le nom et la valeur spécifiée seront automatiquement inclus dans les données de GET ou POST. Chaque fois que le navigateur Web renvoie la demande, la valeur session_id peut être utilisé pour maintenir le suivi des différents navigateur Web.

Cela peut être un moyen efficace de maintenir le suivi de session de la session, mais cliquez sur le lien hypertexte conventionnel (<A HREF...>) ne conduit pas à une soumission de formulaire, de sorte que les champs de formulaire cachés ne prennent pas en charge régulière le suivi de session de la session.

URL Rewriting

Vous pouvez ajouter des données supplémentaires à chaque extrémité de l'URL pour identifier la session de session identifiant de session de la session et les données stockées session, de session associée serveur.

Par exemple, http: //w3cschool.cc/file.htm; sessionid = 12345, identificateur de session de la session est jointe en tant sessionid = 12345, un identificateur peut être accédé au serveur Web pour identifier le client.

La réécriture d'URL est une meilleure façon de maintenir la session de la session, il peut très bien lorsque le navigateur ne supporte pas les cookies, mais son inconvénient est généré dynamiquement pour chaque URL d'attribuer un identifiant de session pour la page de session, même si est très simple des pages HTML statiques seront aussi.

objets HttpSession

En plus de ces trois manières, Servlet fournit également l'interface HttpSession, qui permet à l'utilisateur d'identifier et de stocker des informations sur l'utilisateur lorsqu'une demande plus d'une page croix ou visitez manière.

conteneur de Servlet à utiliser cette interface pour créer une conversation de session entre un client HTTP et le serveur HTTP. Session dure une période de temps déterminée, à travers de multiples demandes ou des connexions de page.

Vous arriverez à obtenir HttpSession objet en appelant la HttpServletRequest Méthode publiquegetSession (), comme suit:

HttpSession session = request.getSession ();

Vous avez besoin avant d' envoyer tout le contenu du document au client appellerequest.getSession ().Voici un résumé de plusieurs méthodes importantes objets HttpSession sont disponibles:

序号方法 & 描述
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 会话无效之前,指定客户端请求之间的时间,以秒为单位。

Exemples de suivi Session

Cet exemple montre comment utiliser l'objet HttpSession pour obtenir la session de la session le temps de création et la dernière fois de l'accès. S'il n'y a pas de session de la session, nous allons créer une nouvelle session par les demandes de session.

package com.w3big.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 实例 - 本教程";
		Integer visitCount = new Integer(0);
		String visitCountKey = new String("visitCount");
		String userIDKey = new String("userID");
		String userID = new String("w3big");
	
		// 检查网页上是否有新的访问者
		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>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>"); 
	}
}

Compiler le précédentServlet SessionTrack, et de créer l'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.w3big.test.SessionTrack</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>SessionTrack</servlet-name>
    <!-- 访问的网址 -->
    <url-pattern>/TomcatTest/SessionTrack</url-pattern>
  </servlet-mapping>
</web-app>

Dans la barre d'adresse du navigateur, entrezhttp: // localhost: 8080 / TomcatTest/ SessionTrack, lorsque vous exécutez d' abord le spectacle les résultats suivants:

Essayez d'exécuter à nouveau la même Servlet, il montrera les résultats suivants:


Supprimer les données de session de session

Lorsque vous avez terminé les données de session d'utilisateur de la session, vous avez les options suivantes:

  • Suppression d' un attribut spécifique:Vous pouvez appeler la méthoderemoveAttribute public void (String nom)pour supprimer une valeur spécifique associée à une clé.
  • Supprimer toute la session de session:Vous pouvez appeler la méthodeinvalidate public void ()pour annuler toute la session de la session.
  • Session pour cette sessionletemps d'expiration:Vous pouvez appeler la méthodepublic void setMaxInactiveInterval (intervalle de int)pour mettre en place une session de temporisation de session séparée.
  • Utilisateurs Déconnexion: Si vousutilisez un serveur pris en charge servlet 2.4, vous pouvez appeler ladéconnexiondconnecter client du serveur Web, et tous les utilisateurs appartenant à toutes les sessions de la session comme invalide.
  • configuration web.xml: Si vous utilisez Tomcat, en plus des méthodes ci - dessus, vous pouvez configurer le délai d' expiration de la session de la session dans le fichier web.xml, comme suit:
  <session-config>
    <session-timeout>15</session-timeout>
  </session-config>

Des exemples de temps au-dessus-out minutes, Tomcat remplace la valeur par défaut de 30 minutes timeout.

getMaxInactiveInterval dans un Servlet dans la méthode () renvoie la session de la session de temporisation, en secondes. Donc, si configuré délai de session dans le temps de la session de web.xml de 15 minutes, puis getMaxInactiveInterval () retournera 900.