АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Вопрос 20.5

Читайте также:
  1. E. Некорректный вопрос
  2. I. Перечень вопросов и тем для подготовки к экзамену
  3. II. Вопросительное предложение
  4. VII. Вопросник для анализа учителем особенностей индивидуального стиля своей педагогической деятельности (А.К. Маркова)
  5. X. примерный перечень вопросов к итоговой аттестации
  6. Аграрный вопрос
  7. Анализ влияния рекламы на продвижение противопростудных средств
  8. Балканский вопрос в начале XXв. Русско-германские отношения
  9. Бланк вопросов
  10. БЛОК № 1 (1 – 10 вопрос)
  11. БЛОК № 2 (11 – 20 вопрос)
  12. Блок № 4 (31 – 40 вопрос)

Какой метод интерфейса Statement необходимо использовать при выполнении SQL-оператора SELECT, который возвращает объект ResulSet?

1) execute();

2) executeQuery();

3) executeUpdate();

4) executeBatch();

5) executeSelect();

6) executeSQL().

 
Глава 21

CЕССИИ, СОБЫТИЯ и ФИЛЬТРЫ

Сеанс (сессия)

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

Сеанс (сессия) – соединение между клиентом и сервером, устанавливаемое на определенное время, за которое клиент может отправить на сервер сколько угодно запросов. Сеанс устанавливается непосредственно между клиентом и Web-сервером. Каждый клиент устанавливает с сервером свой собственный сеанс.

Сеансы используются для обеспечения хранения данных во время нескольких запросов Web-страницы или на обработку информации, введенной в пользовательскую форму в результате нескольких HTTP-соединений (например, клиент совершает несколько покупок в интернет-магазине; студент отвечает на несколько тестов в системе дистанционного обучения). Как правило, при работе с сессией возникают следующие проблемы:

· поддержка распределенной сессии (синхронизация/репликация данных, уникальность идентификаторов и т.д.);

· обеспечение безопасности;

· проблема инвалидации сессии (expiration), предупреждение пользователя об уничтожении сессии и возможность ее продления (watchdog).

Чтобы открыть новый сеанс, используется метод getSession() интерфейса HttpServletRequest. Метод извлекает из переданного в сервлет запроса объект сессии класса HttpSession,соответствующий данному пользователю. Сессия содержит информацию о дате и времени создания последнего обращения
к сессии, которая может быть извлечена с помощью методов
getCreationTime() и getLastAccessedTime().

Если для метода getSession(boolean param) входной параметр равен true, то сервлет-контейнер проверяет наличие активного сеанса, установленного с данным клиентом. В случае успеха метод возвращает дескриптор этого сеанса. В противном случае метод устанавливает новый сеанс:

HttpSession se = request.getSession(true);

после чего начинается сбор информации о клиенте.

Чтобы сохранить значения переменной в текущем сеансе, используется метод setAttribute() класса HttpSession, прочесть – getAttribute(), удалить – removeAttribute(). Список имен всех переменных, сохраненных в текущем сеансе, можно получить, используя метод Enumeration getAttributeNames(), работающий так же, как и соответствующий метод интерфейса HttpServletRequest.

Метод String getId() возвращает уникальный идентификатор, который получает каждый сеанс при создании. Метод isNew() возвращает false для уже существующего сеанса и true – для только что созданного.

Если требуется сохранить для использования одну из переменных сеанса, представляющего собой целое число, то:

se.setAttribute( " teacherId ", new Integer(71));

После этого любой подключившийся к текущему сеансу сервлет сможет прочесть значение переменной teacherId следующим образом:

Integer testId = (Integer)se.getAttribute( " teacherID " );

Завершить сеанс можно методом invalidate(). Сеанс уничтожает все связи с объектами, и данные, сохраненные в старом сеансе, будут потеряны для всех приложений.

/* пример # 1: добавление информации в сессию: SessionServlet.java */

package chapt21;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class SessionServlet extends HttpServlet {

protected void doGet(

HttpServletRequest req,

HttpServletResponse resp)

throws ServletException {

performTask(req, resp);

}

private void performTask(

HttpServletRequest req,

HttpServletResponse resp)

throws ServletException {

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

response.addCookie(cookie);

Извлечь информацию cookie из запроса можно с помощью метода
getCookies() объекта HttpServletRequest, который возвращает массив объектов, составляющих этот файл.

Cookie[] cookies = request.getCookies();

После этого для каждого объекта класса Cookie можно вызвать метод
getValue(), который возвращает строку String c содержимым блока cookie. В данном случае этот метод вернет значение "007".

Объект Cookie имеет целый ряд параметров: путь, домен, номер версии, время жизни, комментарий. Одним из важнейших является срок жизни в секундах от момента первой отправки клиенту. Если параметр не указан, то cookie существует только до момента первого закрытия браузера. Для запуска следующего приложения можно использовать сервлет из примера # 1 этой главы, вставив в метод performTask() следующий код:

CookieWork.setCookie(resp); // добавление cookie

CookieWork.printToBrowser(resp, req); // извлечение cookie

Класс CookieWork имеет вид:

/* пример # 3: создание и чтение cookie: CookieWork.java */

package chapt16;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class CookieWork {

 

public static void setCookie(HttpServletResponse resp) {

String name = "Spiridonov";

String role = "MegaAdmin";

Cookie c = new Cookie(name, role);

c.setMaxAge(3600); // время жизни файла

resp.addCookie(c);

}

public static void printToBrowser(

HttpServletResponse response, HttpServletRequest request) {

try {

response.setContentType("text/html");

PrintWriter out = response.getWriter();

 

Cookie[] cookies = request.getCookies();

if (cookies!= null) {

out.print("Number cookies:"

+ cookies.length + "<BR>");

 

for (int i = 0; i < cookies.length; i++) {

Cookie c = cookies[i];

out.print("Secure:" + c.getSecure() + "<br>");

out.print(c.getName() + " = " + c.getValue()

+ "<br>");

} // end for

} // end if

out.close();

} catch (IOException e) {

e.printStackTrace();

throw new RuntimeException(e.toString());

}

}

}

В результате в файле cookie будет содержаться следующая информация:

Number cookies:1
Secure:false
Spiridonov = MegaAdmin

Файл cookie можно изменять. Для этого следует воспользоваться сервлетом из примера #1 и в метод performTask() добавить следующий код:

CookieCounter.printToBrowser(resp, req);

В классе CookieCounter производится модификация файла cookie, хранимого на компьютере клиента.

/* пример # 4: создание cookie и чтение количества вызовов сервлета из cookie: CookieCounter.java */

package chapt16;

import java.io.IOException;

import java.io.Writer;

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class CookieCounter {

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

public static final int MAX_AGE_COOKIE = 3600 * 24 * 30;

 

public static void printToBrowser(

HttpServletResponse response, HttpServletRequest request) {

try {

Writer out = response.getWriter();

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

/* устанавливает счетчик количества вызовов сервлета пользователем */

out.write(String.valueOf(prepareCookieCounter(

request,response)));

out.flush();

out.close();

} catch (IOException e) {

e.printStackTrace();

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

}

}

// обновляет в сookie счетчик обращений пользователя к сервлету

private static int prepareCookieCounter(

HttpServletRequest request, HttpServletResponse response) {

Cookie[] cookies = request.getCookies();

Cookie counterCookie;

if (cookies!= null) {

for (int i = 0; i < cookies.length; i++) {

if ("counter".equals(cookies[i].getName())) {

String counterStr = cookies[i].getValue();

int counterValue;

try {

counterValue = Integer.parseInt(counterStr);

} catch (NumberFormatException e) {

counterValue = 0;

}

counterValue++;

counterCookie = new Cookie("counter",

String.valueOf(counterValue));

counterCookie.setMaxAge(MAX_AGE_COOKIE);

response.addCookie(counterCookie);

return counterValue;

} //end if

} //end for

} //end if

counterCookie = new Cookie("counter", "1");

counterCookie.setMaxAge(MAX_AGE_COOKIE);

response.addCookie(counterCookie);

return 1;

}

}

В результате в файле cookie будет содержаться следующая информация:


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.035 сек.)