Latest web development tutorials

Servlet Отслеживание сеанса

HTTP является "без гражданства" протокол, что означает, что каждый раз, когда клиент получает страницы, клиент открывает отдельное подключение к веб-серверу, сервер автоматически не записывать до того, как клиентские запросы защищены.

Но есть еще три способа поддержания сеанса разговор между веб-клиента и веб-сервера:

печенье

Веб-сервер может быть присвоен уникальный идентификатор сеанса в качестве сеанса для каждого клиента куки Web, последующие запросы клиента могут быть использованы для идентификации принятого куки.

Это не может быть эффективным методом, потому что многие браузеры не поддерживают куки, поэтому мы не рекомендуем использовать этот способ для поддержания сеанса сеанса.

Скрытые поля формы

Веб-сервер может послать скрытые HTML поля формы, а также уникальный идентификатор сеанса сеанса, следующим образом:

<Тип входного = "скрытые" NAME = "SessionID" значение = "12345">

Эта запись означает, что, когда форма была отправлена, указанное имя и значение будет автоматически включаются в GET или POST данных. Каждый раз, когда веб-браузер посылает обратно запрос, session_id значение может быть использовано, чтобы держать другого отслеживания веб-браузера.

Это может быть эффективным способом для поддержания отслеживания сеанса сеанса, но нажмите на ссылку обычного гипертекста (<A HREF...>) не приводит к отправке формы, поэтому скрытые поля формы не поддерживают регулярное отслеживание сеанса сеанса.

Переписывание URL

Вы можете добавить некоторые дополнительные данные на каждом конце URL для идентификации сеанса сеанса идентификатор сеанса сеанса и данные, сохраненные сессии о сессии связанный сервер.

Например, HTTP: //w3cschool.cc/file.htm; SessionID = 12345, идентификатор сеанса сеанса прилагается в качестве SessionID = 12345, идентификатор можно получить доступ к веб-серверу для идентификации клиента.

URL переписывания является лучшим способом для поддержания сеанса сеанса, он может работать очень хорошо, когда браузер не поддерживает куки, но его недостаток динамически генерируется для каждого URL, чтобы назначить идентификатор сеанса для страницы сеанса, даже если очень просто статические HTML страницы будут тоже.

объекты HttpSession

В дополнение к вышеуказанным трем способами, сервлетов также обеспечивает интерфейс HttpSession, который предоставляет пользователю идентифицировать и хранить информацию о пользователе при получении запроса на кросс более одной страницы или посетить способ.

Servlet контейнер использовать этот интерфейс для создания сеанса разговора между клиентом и сервером HTTP HTTP. Сессия длится определенный период времени, на нескольких запросов страниц или соединений.

Вы придете , чтобы получить объект HttpSession, вызвав HttpServletRequest Открытый методgetSession () следующим образом :

HttpSession сессия = request.getSession ();

Вам необходимо перед отправкой содержимого документа клиенту вызываетrequest.getSession ().Вот краткое изложение нескольких важных методов объектов 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 会话无效之前,指定客户端请求之间的时间,以秒为单位。

Примеры отслеживания сеансов

Этот пример показывает, как использовать объект HttpSession, чтобы получить время создания сеанса сеанса и время последнего доступа. Если нет сеанса сеанса, мы создадим новую сессию запросами сессии.

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

Обобщение предыдущегоServlet SessionTrack, и создать соответствующую запись в файле 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>

В адресной строке браузера введитеHTTP: // локальный: 8080 / TomcatTest/ SessionTrack, при первом запуске шоу следующие результаты:

Попробуйте выполнить тот же самый сервлет снова, он покажет следующие результаты:


Удаление сеанса данные сеанса

После завершения сеанса работы пользователя данные сессии, у вас есть следующие варианты:

  • Удалить определенный атрибут: Вы можете вызвать методобщественного недействительными removeAttribute (String имя), чтобы удалить определенное значение , связанное с ключом.
  • Удалить всю сессию сессии: Вы можете вызвать методобщественного недействительными Invalidate (), чтобы отменить весь сеанс сеанса.
  • Сессия Время истечения устанавливается сессия: Вы можете вызвать методобщественного недействительными setMaxInactiveInterval (INT интервал), чтобы создать отдельный тайм - аут сеанса сеанса.
  • Выйти пользователи: Если выиспользуете поддерживаемый сервлета 2.4 сервер, вы можете вызватьвыходизсистемы, чтобы завершить сеанс клиента веб - сервера, и все пользователи , принадлежащие ко всем сессии сессии недействительными.
  • web.xml конфигурации: Если вы используете Tomcat, в дополнение к перечисленным выше методам, вы можете настроить тайм - аут сеанса сеанса в файле web.xml, следующим образом :
  <session-config>
    <session-timeout>15</session-timeout>
  </session-config>

Примеры выше вне времени минут, Tomcat заменит значение по умолчанию 30-минутный тайм-аут в.

getMaxInactiveInterval в Servlet в методе () возвращает тайм-аут сеанса сеанса в секундах. Таким образом, если сконфигурирован тайм-аут сеанса во времени web.xml сеанса 15 минут, затем getMaxInactiveInterval () вернет 900.