Руководство по Servlets. Сессия.

В данной статье мы рассмотрим сессии при работе с сервлетами.

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

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

  • Скрытые поля форм
    Наш веб сервер может отправлять скрытое поле HTML формы с уникальным идентификатором сессии. При каждом подтверждении – на сервер уходят данные о данной сессии.
  • Cookie
    Мы можем определить идентификатор сессии в 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

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

servletsSessionTrackingDemo

На этом мы заканчиваем отслеживание сессий при работе с сервлетами.

В следующей статье мы рассмотрим обработку cookie.