Сессия

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

Для создания и поддержания сессии есть 3 варианта:

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

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

Мы можем определить идентификатор сессии в cookie-файле, например, session_id.

*Перезаписть URL

Мы можем добавить дополнительные данные к самой URL запроса, например, http://proselyte.net/tutorials/;session_id=100500. Эти данные помогут нашему серверу определить конкретную сессию.

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

Для того, чтобы получить экземпляр реализации HttpSession, мы можем использовать метод класса HttpServletRequest – getSession().

Данный интерфейс содержит следующие методы:

Метод и его описание
1 public Object getAttribute(String name) Позволяет получить экземпляр, связанные с определенным именем в данной сессии.
2 public Enumeration getAttributeNames() Возвращает перечисление (Enumeration) всех объектов с именами, которые связаны с данной сессией.
3 public void setAttribute(String name, Object value) Устанавливает значение указанному атрибуту.
4 public void removeAttribute(String name) Удаляет значение указанного атрибута.
5 public long getLastAccessedTime() Возвращает дату крайнего доступа к сессии (миллисекунды с 1 Января 1970 года).
6 public String getId() Возвращает идентификатор сессии.
7 public void invalidate() Деактивирует текущую сессию.
8 public boolean isNew() Указывает, является ли данная сессия новой.
9 public long getCreationTime() Возвращает время создания сессии (миллисекунды с 1 Января 1970 года).
10 public int getMaxInactiveInterval() Возвращает максимальный интервал времени между доступами к данной сессии.
11 public void setMaxInactiveInterval(int interval) Устанавливает максимальный интервал в секундах между доступами к сессии.

Для понимания того, как это работает на практике, рассмотрим простой пример.
В качестве основы возьмем пример из данной статьи.

Класс SessionTrackingDemo

package net.proselyte.servletstutorial;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

/**
 * Simple servlet that demonstrates using {@link HttpSession} interface.
 *
 * @author Eugene Suleimanov
 */

public class SessionTrackingDemo extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();

        String message = "";

        String sessionId = session.getId();
        Date sessionCreationDate = new Date(session.getCreationTime());
        Date lastSessionAccess = new Date(session.getLastAccessedTime());
        String userId = "userId";

        if (session.isNew()) {
            message = "Welcome to this page";
        } else {
            message = "Glad to see You again";
        }

        response.setContentType("text/html");

        PrintWriter writer = response.getWriter();

        String title = "Session Tracking Demo";
        String docType = "
<
!DOCTYPE html
>
";

        writer.println(docType + "
<
html
>
" +
                "
<
head
>
" +
                "
<
title
>
" + title +
                "
<
/title
>
" +
                "
<
/head
>
" +
                "
<
body
>
" +
                "
<
h1
>
Session Details
<
/h1
>
" +
                "Session ID:" + sessionId +
                "
<
br/
>
" +
                "Created: " + sessionCreationDate +
                "
<
br/
>
" +
                "Last Accessed Date: " + lastSessionAccess +
                "
<
br/
>
" +
                "User ID: " + userId +
                "
<
/body
>
" +
                "
<
/html
>
");

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

Файл web.xml

<
!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" 
>
<
web-app
>
<
display-name
>
Servlets Tutorial
<
/display-name
>
<
servlet
>
<
servlet-name
>
SimpleServlet
<
/servlet-name
>
<
servlet-class
>
net.proselyte.servletstutorial.SimpleServlet
<
/servlet-class
>
<
/servlet
>
<
servlet
>
<
servlet-name
>
SessionTrackingDemo
<
/servlet-name
>
<
servlet-class
>
net.proselyte.servletstutorial.SessionTrackingDemo
<
/servlet-class
>
<
/servlet
>
<
servlet-mapping
>
<
servlet-name
>
SimpleServlet
<
/servlet-name
>
<
url-pattern
>
/SimpleServlet
<
/url-pattern
>
<
/servlet-mapping
>
<
servlet-mapping
>
<
servlet-name
>
SessionTrackingDemo
<
/servlet-name
>
<
url-pattern
>
/SessionTrackingDemo
<
/url-pattern
>
<
/servlet-mapping
>
<
/web-app
>

Выполним в консоли команду:

mvn tomcat7:run

И перейдем по ссылке:

http://localhost:8088/SessionTrackingDemo

В результате получим следующую страницу:

results matching ""

    No results matching ""