Навчання java - java cервлети - збереження стану клієнта

Відстеження сесії це механізм, який сервлети використовують, щоб підтримувати статус між серіями запитів від одного і того ж користувача (запитів вироблених з одного вікна броузера) протягом певного проміжку часу.

Сесії використовуються різними Сервлетами для доступу до одного клієнта. Це зручно для додатків побудованих на декількох сервлетах. Наприклад, Duke's Bookstore використовує відстеження сесії для того, щоб зберігати книги, обрані клієнтом. Всі сервлети в прикладі мають доступ до користувальницької сесії.

Щоб використовувати відстеження сесії:

отримання сесії

Метод getSession об'єкта HttpServletRequest повертає сесію користувача. Коли Ви викликаєте цей метод з аргументом create рівним true. Виконавча створює при необхідності сесію.

Щоб правильно організувати сесію, Вам треба викликати метод getSession перш ніж буде запущений вихідний потік відповіді. (Якщо Ваш відповідь використовує Writer. Вам треба викликати метод getSession. Перш ніж Ви отримаєте доступ до Writer. Перш відправки даних відповіді.)

Приклад Duke's Bookstore використовує простежування сесії для того, щоб зберігати інформацію про книгах в кошику для покупок користувача. Ось приклад сервлету CatalogServlet встановлює сесію користувача:

Збереження і отримання даних сесії

Інтерфейс HttpSession надає методи, які зберігають і повертають дані:

  • Стандартні властивості сесії, такі як ідентифікатор сесії.
  • Дані програми, які зберігаються у вигляді пари з іменним ключем, коли ім'я це рядок (String) і величина - об'єкт Java. (Так само як java.util.Dictionary.) Оскільки використовується доступ декількох сервлетів до користувальницької сесії, Вам треба вибрати умовне іменування, щоб упорядкувати імена відповідних призначених для користувача даних. Це дозволить сервлетам уникнути випадкового перезапису одних величин іншими. Одіна з таких умовностей servletname.name. де servletname це повне ім'я сервлета, включаючи його пакет. Наприклад, com.acme.WidgetServlet.state це закладка з ім'ям сервлету com.acme.WidgetServlet і ім'ям state.

Приклад Duke's Bookstore використовує простежування сесії для того, щоб зберігати інформацію про книгах в кошику для покупок користувача. Ось приклад сервлету CatalogServlet отримує ідентифікатор користувача сесії, який отримує і встановлює дані, відповідні сесії цього користувача:

Тому як об'єкт може бути асоційований з сесією, приклад Duke's Bookstore зберігає книги відібрані користувачем в об'єкті. Цей об'єкт типу ShoppingCart і кожна книга, відібрана користувачем, зберігається в кошику для покупок, тобто в об'єкті ShoppingCartItem. Наприклад, ось, що виходить в такому випадку в методі doGet сервлету CatalogServlet:

У висновку, зазначимо, що сесія може бути розроблена як нова. Нова сесія - якщо метод isNew класу HttpSession повертає true. показує, наприклад, що, клієнт не встановлював сесію ще. З новою сесій дані ще не асоційовані.

Вам треба розібратися з ситуаціями викликають нові сесії. У прикладі Duke's Bookstore наведеному вище, якщо у користувача немає кошика для покупок (єдині дані асоційовані з сесією), сервлет створює йому нову. З іншого боку, якщо Вам потрібна інформація користувача, щоб відкрити сесію (така як ім'я користувача), Ви, можливо, перенаправити користувача на "стартову сторінку", де візьмете всю необхідну інформацію.

завершення сесії

Сесія користувача може бути завершена вручну або, в залежності від того, де запущений сервлет, автоматично. (Наприклад, Java Web Server автоматично завершує сесію, коли протягом певного часу не відбувається запитів, за замовчуванням 30 хвилин.) Завершити сесію означає видалення об'єкта HttpSession і його величин з системи.

Щоб вручну завершити сесію, використовуйте метод сесії invalidate. У деяких програм вже є такі точки, в яких відбувається завершення сесії. Приклад Duke's Bookstore завершує сесію користувача після того, як він здійснив покупку книг. Це відбувається в сервлет ReceiptServlet:

Управління всіма браузерами

За замовчуванням, простежування сесії використовує закладки, щоб асоціювати ідентифікатор сесії з користувачем. Щоб також підтримувати користувачів, у яких броузер не працює з закладками, або включений в режим ігнорування їх, Ви повинні використовувати перезапис URL. (По скільки деякі сервера підтримують перезапис URL, утиліта servletrunner є частиною JSDK2.0 не підтримує це. Для того щоб простеження сесії працювало, коли сервлет запущений за допомогою servletrunner. Клієнт повинен підтримувати закладки.)

Коли Ви використовуєте перезапис URL, Ви викликаєте методи, коли необхідно, так, щоб ідентифікатор був включений у заслання. Ви повинні використовувати ці методи для кожної посиланні у відповіді сервлету.

Зауваження: Тут показаний код, який не є частиною прикладу Duke's Bookstore для JSDK2.1. Приклад Duke's Bookstore міг би містити код, подібний до наведеного нижче, в разі якби використовувалася перезапис URL. Оскільки перезапис URL не є частиною прикладу Duke's Bookstore. вважатимемо цей код псевдокодом.

Якби приклад Duke's Bookstore використовував перезапис URL, його код в сервлет CatalogServlet міг би виглядати наступним чином:

Коли користувач тисне на посилання переписаного URL, сервлет визначає і витягує ідентифікатор сесії. Далі використовується метод getSession. щоб отримати відповідний ідентифікатором сесії об'єкт HttpSession

І назад, якщо броузер користувача не підтримує закладки, і користувач натискає на НЕ переписаний URL, сесія користувача пропадає. Сервлет, взаємодіючи через це посилання, створює нову сесію, а нова сесія не містить даних відповідних колишньої сесії. Якщо сервлет втрачає дані сесії, ці дані губляться для всіх сервлетов їх використовують. Ви повинні також використовувати методи перезапису URL, якщо хочете, щоб Ваш сервлет підтримував клієнтів, які не працюють або які не підтримують закладки.