Latest web development tutorials

Servlet Śledzenie sesji

HTTP jest protokołem "bezpaństwowiec", co oznacza, że ​​za każdym razem klient pobiera stron, klient otwiera oddzielne połączenie z serwerem WWW, serwer nie będzie automatycznie nagrywać zanim jakiekolwiek żądania klientów są zastrzeżone.

Ale nadal istnieją trzy sposoby, aby utrzymać rozmowę sesji pomiędzy klientem a serwerem sieci Web:

ciastka

Serwer sieci Web może być przypisany unikalny identyfikator sesji w sesji dla każdego klienta ciasteczka internetowej, kolejne żądania dla klienta mogą być wykorzystywane do identyfikacji otrzymane ciasteczko.

To może nie być skuteczna metoda, ponieważ wielu przeglądarek nie obsługuje plików cookie, dlatego nie zaleca się stosowania w ten sposób do utrzymania sesji session.

Ukryte pola formularzy

Serwer WWW może wysłać ukrytych pól formularza HTML, a także unikalny identyfikator sesji session, co następuje:

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

Ten zapis oznacza, że ​​gdy formularz jest składany, określona nazwa i wartość zostanie automatycznie włączone GET lub POST danych. Za każdym razem, gdy przeglądarka wysyła żądanie, wartość session_id mogą być wykorzystywane do prowadzenia innego śledzenia przeglądarki internetowej.

To może być skutecznym sposobem na utrzymanie śledzenie sesji sesji, ale po kliknięciu na konwencjonalnych łącze hipertekstowe (<a HREF...>) nie doprowadzi do złożenia formularza, więc ukrytych pól formularza nie obsługują regularne śledzenie sesji session.

Przepisywanie URL

Możesz dodać jakieś dodatkowe informacje na każdym końcu adresu URL w celu identyfikacji sesji session Sesja identyfikator sesji i danych przechowywanych sesji o sesji powiązany serwer.

Na przykład http: //w3cschool.cc/file.htm; sessionid = 12345, identyfikator sesji sesja jest załączony jako sessionid = 12345, identyfikator można uzyskać dostęp do serwera WWW w celu identyfikacji klienta.

Przepisywanie URL jest lepszym sposobem na utrzymanie sesji session, działa bardzo dobrze, gdy przeglądarka nie obsługuje plików cookie, ale jego wadą jest dynamicznie generowane dla każdego adresu URL, aby przypisać identyfikator sesji dla strony sesji, nawet jeśli jest bardzo prosta statycznych stron HTML będzie też.

obiekty HttpSession

Oprócz tych trzech sposobów serwletów również interfejs HttpSession, który zapewnia użytkownikowi określić i przechowywania informacji o użytkowniku, gdy przekrój żądanie więcej niż jednej lub wizyty sposób.

kontener serwletów używać tego interfejsu do tworzenia rozmowę sesji pomiędzy klientem a serwerem HTTP HTTP. Sesja trwa przez określony okres czasu, w wielu żądań stron lub połączeń.

Będziesz się dostać HttpSession obiektu poprzez wywołanie metody HttpServletRequest PublicgetSession () w następujący sposób:

HttpSession session = request.getSession ();

Trzeba przed wysłaniem jakichkolwiek treści dokumentu do klienta zwracarequest.getSession ().Oto zestawienie kilku ważnych metod obiektów HttpSession są dostępne:

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

Śledzenie sesji Przykłady

Ten przykład pokazuje, jak używać obiektu HttpSession, aby uzyskać czas tworzenia sesji session i ostatni czas dostępu. Jeśli nie ma sesji sesji, będziemy tworzyć nową sesję przez żądania sesji.

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

Skompilować poprzedniServlet SessionTrack i utworzyć odpowiedni wpis w pliku 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>

W pasku adresu przeglądarki wpiszhttp: // localhost: 8080 / TomcatTest/ SessionTrack, gdy po raz pierwszy uruchomić pokaz następujące wyniki:

Spróbuj ponownie uruchomić ten sam Servlet, to pokaże następujące wyniki:


Usuń dane sesji Session

Po zakończeniu sesji użytkownika, a dane sesji, dostępne są następujące opcje:

  • Usuń specyficzną cechę: można wywołać metodęvoid removeAttribute (String name)w celu usunięcia określonej wartości związanej z kluczem.
  • Usuń całą sesję sesji: Można wywołać metodęvoid invalidate (),aby usunąć całą sesję sesji.
  • Sesja ustawić czas wygaśnięcia sesji: Można wywołać metodępublic void setMaxInactiveInterval (int interval),aby utworzyć oddzielny limit czasu sesji session.
  • Wyloguj Użytkownicy: Jeśli używaszobsługiwanego serwera servlet 2.4, można zadzwonić dowylogowaniasię wylogować klienta serwera sieci Web, a wszyscy użytkownicy należący do wszystkich sesji session za nieważne.
  • web.xml konfiguracja: Jeśli używasz Tomcat, oprócz powyższych metod można skonfigurować limit czasu sesji sesji w pliku web.xml, co następuje:
  <session-config>
    <session-timeout>15</session-timeout>
  </session-config>

Przykłady wyżej out time jest minuta, Tomcat zastąpi domyślną 30-minutowy limit czasu.

getMaxInactiveInterval w serwletu w metodzie () zwraca sesji session limit czasu w sekundach. Tak więc, jeśli jest skonfigurowana limitu czasu sesji w sesji web.xml czasie 15 minut, po czym getMaxInactiveInterval () powróci 900.