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