SessionLogic.printToBrowser(resp, req);

}

}

package chapt21;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.Date;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

public class SessionLogic {

 

public static void printToBrowser(

HttpServletResponse resp, HttpServletRequest req) {

try {

/* возвращается ссылка на сессию для текущего пользователя (если сессия еще не существует, то она при этом создается) */

HttpSession session = req.getSession(true);

 

PrintWriter out = resp.getWriter();

 

StringBuffer url = req.getRequestURL();

session.setAttribute("URL", url);

 

out.write("My session counter: ");

/* количество запросов, которые были сделаны к данному сервлету текущим пользователем в рамках текущей пользовательской сессии (следует приводить значение к строковому виду для корректного отображения в результате) */

out.write(String.valueOf(prepareSessionCounter(session)));

out.write("<br> Creation Time : "

+ new Date(session.getCreationTime()));

out.write("<br> Time of last access : "

+ new Date(session.getLastAccessedTime()));

out.write("<br> session ID : "

+ session.getId());

out.write("<br> Your URL: " + url);

int timeLive = 60 * 30;

session.setMaxInactiveInterval(timeLive);

out.write("<br>Set max inactive interval : "

+ timeLive + "sec");

 

out.flush();

out.close();

} catch (IOException e) {

e.printStackTrace();

throw new RuntimeException("Failed : " + e);

}

}

/* увеличивает счетчик обращений к текущему сервлету и кладет его в сессию */

private static int prepareSessionCounter(

HttpSession session) {

Integer counter =

(Integer)session.getAttribute("counter");

 

if (counter == null) {

session.setAttribute("counter", 1);

return 1;

} else {

counter++;

session.setAttribute("counter", counter);

return counter;

}

}

}

В результате в браузер будет выведено:

My session counter: 3
Creation Time : Sun Jan 29 16:02:30 EET 2006
Time of last access : Sun Jan 29 16:02:38 EET 2006
session ID : 314A546CD9270A840E0BDA3286636B20
Your URL: http://localhost:8080/FirstProject/SessionServlet
Set max inactive interval : 1800sec

В качестве данных сеанса выступают: счетчик кликов – объект типа Integer и URL запроса, сохраненный в объекте StringBuffer. В ответ на поль­зовательский запрос сервлет SessionServlet возвращает страницу HTML, на которой отображаются все атрибуты сессии, время создания и последнего доступа, идентификационный номер сессии и время инвалидации (жизни) сессии. Это время можно задать с помощью тега session-config в web.xmlв виде:

<session-config>

<session-timeout>30</session-timeout>

</session-config>

где время ожидания задается в минутах.

В следующем примере рассмотрен процесс ликвидации сессии при отсутствии активности за определенный промежуток времени.

/* пример # 2 : инвалидация и ликвидация сессии : TimeSessionServlet.java */

package chapt21;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

public class TimeSessionServlet extends HttpServlet {

boolean flag = true;

 

protected void doGet(HttpServletRequest req,

HttpServletResponse resp)

throws ServletException {

performTask(req, resp);

}

private void performTask(HttpServletRequest req,

HttpServletResponse resp) throws ServletException {

 

HttpSession session = null;

if (flag) {

//создание сессии и установка времени инвалидации

session = req.getSession();

int timeLive = 10; //десять секунд!

session.setMaxInactiveInterval(timeLive);

flag = false;

} else{

//если сессия не существует, то ссылка на нее не будет получена

session = req.getSession(false);

}

TimeSession.go(resp, req, session);

}

}

package chapt21;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.Date;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

public class TimeSession {

 

public static void go(HttpServletResponse resp, HttpServletRequest req, HttpSession session ) {

PrintWriter out = null;

try {

out = resp.getWriter();

out.write("<br> Creation Time : "

+ new Date(session.getCreationTime()));

out.write("<br> Session alive! ");

 

out.flush();

out.close();

} catch(NullPointerException e) {

//если сессия не существует, то генерируется исключение

if (out != null)

out.print("Session disabled!");

} catch(IOException e) {

e.printStackTrace();

throw new RuntimeException("i/o failed: " + e);

}

}

}

При первом запуске в браузер будет выведено:

Creation Time : Tue Aug 14 17:54:23 EEST 2007
Session alive!

Если повторить запрос к сервлету менее чем за 10 секунд, вывод будет повторен. Если же запрос повторить более через десять секунд, сессия будет автоматически уничтожена, и в браузер будет выведено следующее:

Session disabled!

Cookie

Для хранения информации на компьютере клиента используются возможности класса Cookie.

Cookie – это небольшие блоки текстовой информации, которые сервер посылает клиенту для сохранения в файлах cookies. Клиент может запретить браузеру прием файлов cookies. Браузер возвращает информацию обратно на сервер как часть заголовка HTTP, когда клиент повторно заходит на тот же Web-ресурс. Cookies могут быть ассоциированы не только с сервером, но и также с доменом – в этом случае браузер посылает их на все серверы указанного домена. Этот принцип лежит в основе одного из протоколов обеспечения единой идентификации пользователя (Single Signon), где серверы одного домена обмениваются идентификационными маркерами (token) с помощью общих сookies.

Cookie были созданы в компании Netscape как средства отладки, но теперь используются повсеместно. Файл cookie – это файл небольшого размера для хранения информации, который создается серверным приложением и размещается на компьютере пользователя. Браузеры накладывают ограничения на размер файла cookie и общее количество cookie, которые могут быть установлены на пользовательском компьютере приложениями одного Web-сервера.

Чтобы послать cookie клиенту, сервлет должен создать объект класса Cookie, указав конструктору имя и значение блока, и добавить их в объект-response. Конструктор использует имя блока в качестве первого параметра, а его значение – в качестве второго.

Cookie cookie = new Cookie("myid","007");