|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Вопрос 20.5Какой метод интерфейса Statement необходимо использовать при выполнении SQL-оператора SELECT, который возвращает объект ResulSet? 1) execute(); 2) executeQuery(); 3) executeUpdate(); 4) executeBatch(); 5) executeSelect(); 6) executeSQL(). CЕССИИ, СОБЫТИЯ и ФИЛЬТРЫ Сеанс (сессия) При посещении клиентом Web-ресурса и выполнении вариантов запросов, контекстная информация о клиенте не хранится. В протоколе HTTP нет возможностей для сохранения и изменения информации о предыдущих посещениях клиента. При этом возникают проблемы в распределенных системах c различными уровнями доступа для разных пользователей. Действия, которые может делать администратор системы, не может выполнять гость. В данном случае необходима проверка прав пользователя при переходе с одной страницы на другую. В иных случаях необходима информация о предыдущих запросах клиента. Существует несколько способов хранения текущей информации о клиенте или о нескольких соединениях клиента с сервером. Сеанс (сессия) – соединение между клиентом и сервером, устанавливаемое на определенное время, за которое клиент может отправить на сервер сколько угодно запросов. Сеанс устанавливается непосредственно между клиентом и Web-сервером. Каждый клиент устанавливает с сервером свой собственный сеанс. Сеансы используются для обеспечения хранения данных во время нескольких запросов Web-страницы или на обработку информации, введенной в пользовательскую форму в результате нескольких HTTP-соединений (например, клиент совершает несколько покупок в интернет-магазине; студент отвечает на несколько тестов в системе дистанционного обучения). Как правило, при работе с сессией возникают следующие проблемы: · поддержка распределенной сессии (синхронизация/репликация данных, уникальность идентификаторов и т.д.); · обеспечение безопасности; · проблема инвалидации сессии (expiration), предупреждение пользователя об уничтожении сессии и возможность ее продления (watchdog). Чтобы открыть новый сеанс, используется метод getSession() интерфейса HttpServletRequest. Метод извлекает из переданного в сервлет запроса объект сессии класса HttpSession,соответствующий данному пользователю. Сессия содержит информацию о дате и времени создания последнего обращения Если для метода 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 В качестве данных сеанса выступают: счетчик кликов – объект типа 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 Если повторить запрос к сервлету менее чем за 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 из запроса можно с помощью метода Cookie[] cookies = request.getCookies(); После этого для каждого объекта класса Cookie можно вызвать метод Объект 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 Файл 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 { /* константа, которая будет использована для установки максимального 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 будет содержаться следующая информация: Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.034 сек.) |