Latest web development tutorials

Servlet Session-Tracking

HTTP ist ein "staatenlos" Protokoll, was bedeutet, dass jedes Mal, wenn der Client die Seiten abruft, öffnet der Client eine separate Verbindung zum Web-Server, der Server nicht automatisch erfassen, bevor Client-Anfragen reserviert sind.

Aber es gibt noch drei Möglichkeiten Sitzung Gespräch zwischen dem Web-Client und dem Web-Server zu erhalten:

Kekse

Ein Web-Server kann eine eindeutige Session-ID als die Sitzung für jeden Web-Client-Cookie, nachfolgende Anforderungen für den Kunden zugeordnet werden können, um das empfangene Cookie zu identifizieren.

Dies kann nicht eine wirksame Methode sein, da viele Browser Cookies nicht unterstützen, so dass wir nicht mit dieser Art und Weise nicht empfehlen Sitzung Sitzung zu halten.

Versteckte Formularfelder

Ein Web-Server kann eine versteckte HTML-Formularfelder, sowie eine einzigartige Sitzung Session-ID zu senden, wie folgt:

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

Dieser Eintrag bedeutet, dass, wenn das Formular abgeschickt wird, wird der angegebene Name und Wert automatisch in GET oder POST-Daten enthalten sein. Jedes Mal, wenn der Web-Browser kann den Antrag, session_id Wert sendet verwendet werden, um verschiedene Web-Browser-Tracking zu halten.

Dies kann ein effektiver Weg sein, um Session-Session-Tracking erhalten, sondern klicken Sie auf die konventionelle Hypertext-Link (<A HREF...>) führt nicht zu einer Form vor, so dass die versteckten Formularfelder nicht regulären Sitzung Session-Tracking unterstützen.

URL Rewriting

Sie können zusätzliche Daten auf jedem Ende der URL an die Sitzung Sitzung Sitzung Sitzungs-ID und die Daten gespeichert Sitzung über Sitzung zugeordneten Server zu identifizieren.

Zum Beispiel http: //w3cschool.cc/file.htm; sessionid = 12345, Sitzung Sitzungskennung als sessionid = 12345 angeschlossen ist, kann eine Kennung auf den Webserver zugegriffen werden, um den Client zu identifizieren.

URL-Rewriting ist ein besserer Weg Sitzung Sitzung zu halten, kann es sehr gut funktionieren, wenn der Browser Cookies nicht unterstützt, aber sein Nachteil wird dynamisch für jede URL erzeugt eine Session-ID für die Sitzung Seite zuweisen, auch wenn sehr einfach statische HTML-Seiten, zu sein.

Http Objekte

Zusätzlich zu den obigen drei Möglichkeiten bietet auch die Servlet Http Schnittstelle, die dem Benutzer Informationen über den Benutzer, wenn ein Quer mehr als eine Seite oder auf Anfrage Weise zu identifizieren und zu speichern, zur Verfügung stellt.

Servlet-Container diese Schnittstelle zu verwenden, um eine Sitzung Gespräch zwischen einem HTTP-Client und HTTP-Server zu erstellen. Session dauert eine bestimmte Zeit, über mehrere Seitenanforderungen oder Verbindungen.

Sie kommen Http Objekt zu erhalten , indem die HttpServletRequest Öffentliche MethodegetSession () aufgerufen wird ,wie folgt:

Http session = request.getSession ();

Sie müssen vor dem Kunden ein Dokument Inhalt zu senden ruftrequest.getSession ().Hier ist eine Zusammenfassung von mehreren wichtigen Methoden Http Objekte stehen zur Verfügung:

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

Session-Tracking-Beispiele

Dieses Beispiel zeigt, wie der Http Objekt zu verwenden Sitzung Sitzungserstellungszeit und der letzten Zugriffszeit zu erhalten. Wenn es keine Sitzung Sitzung ist, werden wir eine neue Sitzung von Sitzungsanforderungen erstellen.

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>"); 
	}
}

Kompilieren Sie den vorherigenServlet SessionTrack, und erstellen Sie den entsprechenden Eintrag in der Datei 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>

In der Browser - Adressleiste, geben Siehttp: // localhost: 8080 / TomcatTest/ SessionTrack, wenn Sie zuerst die Show laufen die folgenden Ergebnisse:

Probieren Sie das gleiche Servlet wieder zu laufen, wird es die folgenden Ergebnisse zeigen:


Löschen Session Sitzungsdaten

Wenn Sie eine Sitzung Benutzersitzungsdaten beendet haben, haben Sie folgende Möglichkeiten:

  • Entfernen Sie ein bestimmtes Attribut:Sie können diepublic void removeAttribute (String name)-Methode aufrufen , um einen bestimmten Wert mit einem Schlüssel zugeordnet zu entfernen.
  • Löschen Sie die gesamte Sitzung Sitzung:Sie können diepublic void invalidate ()-Methode aufrufen , die gesamte Sitzung Sitzung zu verwerfen.
  • Session set session Ablaufzeit: Sie können diepublic void setMaxInactiveInterval (int Intervall)-Methode aufrufen , eine separate Sitzung Sitzung Timeout einzurichten.
  • Logout - Benutzer:WennSieein unterstütztes Servlet 2.4 - Server verwenden, können Sie dieAbmeldungrufen Web - Server - Client, und alle Benutzer Gehören alle Session - Sitzung als ungültig abzumelden.
  • web.xml Konfiguration: Wenn Sie Tomcat verwenden, zusätzlich zu den oben genannten Methoden, können Sie die Sitzung Session - Timeout in web.xml - Datei zu konfigurieren, wie folgt:
  <session-config>
    <session-timeout>15</session-timeout>
  </session-config>

Beispiele für die oben-out-Zeit ist nur wenige Minuten, Tomcat wird die Standard-30-Minuten-Timeout außer Kraft setzen.

getMaxInactiveInterval in einem Servlet in () Methode gibt den Timeout-Sitzung Sitzung, in Sekunden. Also, wenn konfiguriert Session-Timeout in web.xml Sitzungszeit von 15 Minuten, dann getMaxInactiveInterval () wird 900 zurück.