Автор оригинала: Pankaj Kumar.
Управление сеансами в веб-приложениях Java Сервлетов-очень интересная тема. Сеанс в Java Сервлет управляется различными способами, такими как файлы cookie, HttpSession API, переписывание URL-адресов и т.д.
Это третья статья в серии учебников по веб-приложениям на Java, возможно, вам также захочется ознакомиться с двумя предыдущими статьями.
- Учебник по веб-приложениям Java
- Учебник по сервлетам Java
Управление сеансами на Java
Эта статья предназначена для объяснения управления сеансами в сервлетах с использованием различных методов и с примерами программ.
- Что такое Сеанс?
- Управление сеансами в Java – файлах Cookie
- Сеанс в сервлете Java – HttpSession
- Управление сеансами в сервлете Java – Переписывание URL-адресов
Что такое Сеанс?
Протокол HTTP и веб-серверы не имеют состояния, это означает, что для веб-сервера каждый запрос является новым запросом для обработки, и они не могут определить, поступает ли он от клиента, который ранее отправлял запрос.
Но иногда в веб-приложениях мы должны знать, кто является клиентом, и соответствующим образом обрабатывать запрос. Например, приложение корзины покупок должно знать, кто отправляет запрос на добавление товара и в какую корзину должен быть добавлен товар, или кто отправляет запрос на оформление заказа, чтобы он мог списать сумму с правильного клиента.
Сеанс – это состояние разговора между клиентом и сервером, и оно может состоять из нескольких запросов и ответов между клиентом и сервером. Поскольку HTTP и веб-сервер не имеют состояния, единственный способ поддерживать сеанс-это когда некоторая уникальная информация о сеансе (идентификатор сеанса) передается между сервером и клиентом в каждом запросе и ответе.
Существует несколько способов, с помощью которых мы можем предоставить уникальный идентификатор в запросе и ответе.
- Аутентификация пользователя – Это очень распространенный способ, при котором пользователь может предоставить учетные данные для аутентификации со страницы входа в систему, а затем мы можем передать информацию для аутентификации между сервером и клиентом для поддержания сеанса. Это не очень эффективный метод, потому что он не будет работать, если один и тот же пользователь вошел в систему из разных браузеров.
- Скрытое поле HTML – Мы можем создать уникальное скрытое поле в HTML, и когда пользователь начнет навигацию, мы сможем установить его значение, уникальное для пользователя, и отслеживать сеанс. Этот метод нельзя использовать со ссылками, поскольку он требует, чтобы форма отправлялась каждый раз, когда клиент отправляет запрос на сервер со скрытым полем. Кроме того, это небезопасно, потому что мы можем получить значение скрытого поля из источника HTML и использовать его для взлома сеанса.
- Переписывание URL – Мы можем добавлять параметр идентификатора сеанса к каждому запросу и ответу, чтобы отслеживать сеанс. Это очень утомительно, потому что нам нужно отслеживать этот параметр в каждом ответе и следить за тем, чтобы он не конфликтовал с другими параметрами.
- Файлы cookie – Файлы cookie-это небольшой фрагмент информации, который отправляется веб-сервером в заголовке ответа и сохраняется в файлах cookie браузера. Когда клиент делает дополнительный запрос, он добавляет файл cookie в заголовок запроса, и мы можем использовать его для отслеживания сеанса. Мы можем поддерживать сеанс с помощью файлов cookie, но если клиент отключит файлы cookie, то это не будет работать.
API управления сеансами – API управления сеансами построен поверх вышеперечисленных методов отслеживания сеансов. Некоторые из основных недостатков всех вышеперечисленных методов заключаются в следующем:
- В большинстве случаев мы не хотим отслеживать только сеанс, мы должны хранить некоторые данные в сеансе, которые мы можем использовать в будущих запросах. Это потребует больших усилий, если мы попытаемся это реализовать.
- Все вышеперечисленные методы сами по себе не являются полными, все они не будут работать в конкретном сценарии. Поэтому нам нужно решение, которое может использовать эти методы отслеживания сеансов для обеспечения управления сеансами во всех случаях.
Вот почему нам нужен API управления сеансами и технология сервлетов J2EE поставляется с API управления сеансами, который мы можем использовать.
Управление сеансами в Java – файлах Cookie
Файлы cookie часто используются в веб-приложениях для персонализации ответа на основе вашего выбора или для отслеживания сеанса. Прежде чем перейти к API управления сеансами сервлетов, я хотел бы показать, как мы можем отслеживать сеансы с помощью файлов cookie с помощью небольшого веб-приложения.
Мы создадим динамическое веб-приложение Пример сервлета Cookie со структурой проекта, как показано на рисунке ниже.
Дескриптор развертывания web.xml веб – приложения является:
Страница приветствия нашего приложения является login.html где мы получим данные аутентификации от пользователя.
Вот файл входа в систему, который обрабатывает запрос на вход.
Обратите внимание на файл cookie, который мы устанавливаем для ответа, а затем пересылаем его в LoginSuccess.jsp, этот файл cookie будет использоваться там для отслеживания сеанса. Также обратите внимание, что время ожидания файлов cookie установлено на 30 минут. В идеале должна существовать сложная логика для установки значения файла cookie для отслеживания сеанса, чтобы он не сталкивался с каким-либо другим запросом.
Обратите внимание, что если мы попытаемся получить прямой доступ к JSP, он перенаправит нас на страницу входа в систему. Когда мы нажмем на кнопку выхода, мы должны убедиться, что файл cookie удален из браузера клиента.
Нет способа удалить файл cookie, но мы можем установить максимальный возраст 0, чтобы он был немедленно удален из браузера клиента.
Когда мы запускаем приложение выше, мы получаем ответ, как показано на изображениях ниже.
Сеанс в сервлете Java – HttpSession
API сервлета обеспечивает управление сеансами через интерфейс
HttpSession. Мы можем получить сеанс из объекта HttpServletRequest, используя следующие методы. HttpSession позволяет нам устанавливать объекты в качестве атрибутов, которые могут быть получены в будущих запросах.- HttpSession getSession() – Этот метод всегда возвращает объект HttpSession. Он возвращает объект сеанса, прикрепленный к запросу, если к запросу не прикреплен сеанс, то он создает новый сеанс и возвращает его.
- HttpSession getSession(логический флаг) – Этот метод возвращает объект HttpSession, если запрос имеет сеанс, иначе он возвращает значение null.
Некоторые из важных методов HttpSession являются:
- String getId() – Возвращает строку, содержащую уникальный идентификатор, присвоенный этому сеансу.
- Атрибут getAttribute объекта(имя строки) – Возвращает объект, связанный с указанным именем в этом сеансе, или значение null, если ни один объект не связан под именем. Некоторые другие методы работы с атрибутами сеанса:
getAttributeNames(),removeAttribute(имя строки)иsetAttribute(имя строки, значение объекта). - long getCreationTime() – Возвращает время создания этого сеанса, измеренное в миллисекундах с полуночи 1 января 1970 года по Гринвичу. Мы можем получить время последнего доступа с помощью метода
getLastAccessedTime (). - setMaxInactiveInterval(интервал int) – Указывает время в секундах между запросами клиента до того, как контейнер сервлета аннулирует этот сеанс. Мы можем получить значение тайм-аута сеанса из метода
getMaxInactiveInterval (). - ServletContext getServletContext() – Возвращает объект ServletContext для приложения.
- логическое значение isNew() – Возвращает значение true, если клиент еще не знает о сеансе или если клиент решил не присоединяться к сеансу.
- void invalidate() – Аннулирует этот сеанс, а затем отменяет привязку любых объектов к нему.
Понимание файлов cookie JSESSIONID
Когда мы используем метод HttpServletRequest getSession() и он создает новый запрос, он создает новый объект HttpSession, а также добавляет файл cookie в объект ответа с именем JSESSIONID и значением в качестве идентификатора сеанса. Этот файл cookie используется для идентификации объекта HttpSession в дальнейших запросах от клиента. Если файлы cookie отключены на стороне клиента, и мы используем перезапись URL-адреса, то этот метод использует значение jsessionid из URL-адреса запроса для поиска соответствующего сеанса. Файл cookie JSESSIONID используется для отслеживания сеансов, поэтому мы не должны использовать его в целях нашего приложения, чтобы избежать любых проблем, связанных с сеансами.
Давайте рассмотрим пример управления сеансами с использованием объекта HttpSession. Мы создадим динамический веб-проект в Eclipse с контекстом сервлета в качестве примера HttpSession сервлета. Структура проекта будет выглядеть так, как показано на рисунке ниже.
login.html это то же самое, что и в предыдущем примере, и определено как страница приветствия для приложения в web.xml
Сервлет LoginServlet создаст сеанс и установит атрибуты, которые мы сможем использовать в других ресурсах или в будущих запросах.
Наш код LoginSuccess.jsp приведен ниже.
Когда используется ресурс JSP, контейнер автоматически создает для него сеанс, поэтому мы не можем проверить, равен ли сеанс нулю, чтобы убедиться, что пользователь прошел через страницу входа в систему, поэтому мы используем атрибут сеанса для проверки запроса.
Страница оформления заказа.jsp-это еще одна страница, и ее код приведен ниже.
Наш код входа в систему приведен ниже.
Обратите внимание, что я печатаю значение файла cookie JSESSIONID в журналах, вы можете проверить журнал сервера, где он будет печатать то же значение, что и идентификатор сеанса в LoginSuccess.jsp
На изображениях ниже показано выполнение нашего веб-приложения.
Управление сеансами в сервлете Java – Переписывание URL-адресов
Как мы видели в предыдущем разделе, мы можем управлять сеансом с помощью HttpSession, но если мы отключим файлы cookie в браузере, это не будет работать, потому что сервер не получит файл cookie JSESSIONID от клиента. API сервлета обеспечивает поддержку перезаписи URL-адресов, которую мы можем использовать для управления сеансом в этом случае.
Самое приятное то, что с точки зрения кодирования он очень прост в использовании и включает в себя один шаг – кодирование URL-адреса. Еще одна хорошая особенность кодирования URL-адресов сервлетов заключается в том, что это запасной подход, и он срабатывает только в том случае, если файлы cookie браузера отключены.
Мы можем кодировать URL-адрес с помощью метода HttpServletResponse
encodeURL (), и если нам нужно перенаправить запрос на другой ресурс и мы хотим предоставить информацию о сеансе, мы можем использовать методencodeRedirectURL ().Мы создадим аналогичный проект, как описано выше, за исключением того, что мы будем использовать методы перезаписи URL-адресов, чтобы убедиться, что управление сеансами работает нормально, даже если файлы cookie отключены в браузере.
URL-адрес сеанса сервлета, переписывающий структуру проекта в eclipse, выглядит следующим образом.
Когда мы запускаем этот проект, сохраняя файлы cookie отключенными в браузере, на изображениях ниже показаны страницы ответов, обратите внимание на идентификатор jsessionid в URL адресной строки браузера. Также обратите внимание, что на странице успешного входа имя пользователя равно нулю, поскольку браузер не отправляет файл cookie, отправленный в последнем ответе.
Если файлы cookie не отключены, вы не увидите идентификатор jsessionid в URL-адресе, поскольку в этом случае API сеанса сервлета будет использовать файлы cookie.
Это все для управления сеансами в сервлетах java, мы рассмотрим фильтры сервлетов, прослушиватели и файлы cookie в будущих статьях.
Обновление: Ознакомьтесь со следующей статьей в фильтре сервлетов серии .
Скачать Проекты
- Скачать Пример Проекта Файлов Cookie Сервлета
- Скачать Пример проекта HttpSession Сервлета
- Скачать Пример перезаписи URL-адреса Сеанса Сервлета Пример проекта