Управление всеми броузерами
По умолчанию, прослеживание сессии использует закладки, чтобы ассоциировать идентификатор сессии с пользователем. Чтобы также поддерживать пользователей, у которых броузер не работает с закладками, или включен в режим игнорирования их, Вы должны использовать перезапись URL. (По скольку некоторые сервера поддерживают перезапись URL, утилита servletrunner являющаяся частью JSDK2.0 не поддерживает это. Для того чтобы прослеживания сессии работало, когда сервлет запущен с помощью servletrunner, клиент должен поддерживать закладки.)
Когда Вы используете перезапись URL, Вы вызываете методы, когда необходимо, так, чтобы идентификатор был включен в ссылку. Вы должны использовать эти методы для каждой ссылке в ответе сервлета.
Методом, который ассоциирует идентификатор сессии с URL, является метод HttpServletResponse.encodeUrl в пакете JSDK2.0 и HttpServletResponse.encodeURL в пакете JSDK2.1. Если Вы переадресовываете пользователя на другую страницу, методом, который ассоциирует идентификатор сессии с URL, является метод HttpServletResponse.encodeRedirectUrl в пакете JSDK2.0 и HttpServletResponse.encodeRedirectURL в пакете JSDK2.1.
Методы URL кодирования и кодирования переадресации определяют должен ли URL быть перезаписан и возвращают измененный или не измененный URL. (Правила для URL-ов и переадресуемых URL-ов разные, но в основном, если сервер определяет, что данный броузер поддерживает закладки, URL переписан не будет.)
Замечание: Здесь показан код, не являющийся частью примера Duke's Bookstore для JSDK2.1. Пример Duke's Bookstore мог бы содержать код, подобный приведенному ниже, в случае если бы использовалась перезапись URL. Поскольку перезапись URL не является частью примера Duke's Bookstore, будем считать этот код псевдокодом.
Если бы пример Duke's Bookstore использовал перезапись URL, его код в сервлете CatalogServlet мог бы выглядеть следующим образом:
public class CatalogServlet extends HttpServlet {
public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Получаем сесию пользователя, корзину для покупок, Writer и тому подобное.
... // пишем ответ
out.println("<html>" + ...); ... // берем каталог и отправляем его, красиво отформатировав
BookDetails[] books = database.getBooksSortedByTitle(); ... for(int i=0; i < numBooks; i++) { ... //Выводим инвормацию для книги в две строчки
out.println("<tr>" + ...
"<a href=\"" + response.encodeURL("/servlet/bookdetails?bookId=" + bookId) + "\"> <strong>" + books[i].getTitle() + " </strong></a></td>" + ...
"<a href=\"" + response.encodeURL("/servlet/catalog?Buy=" + bookId) + "\"> Add to Cart </a></td></tr>" +
} } }
Отметим, что сервлет CatalogServlet возвращает пользователю две ссылки для каждой книги. Одна ссылка предлагает просмотр подробностей касающихся книги, и вторая позволяет добавить книгу в корзину для покупок. Обе ссылки будут переписаны так как, опять, каждая ссылка, которую сервлет возвращает пользователю должна быть переписана, когда Вы используете метод перезаписи URL.
Когда пользователь жмет на ссылку переписанного URL, сервлет определяет и извлекает идентификатор сессии. Далее используется метод getSession, чтобы получить соответствующий идентификатору сессии объект HttpSession.
И обратно, если броузер пользователя не поддерживает закладки, и пользователь нажимает на не переписанный URL, сессия пользователя пропадает. Сервлет, взаимодействуя через эту ссылку, создает новую сессию, а новая сессия не содержит данных соответствующих прежней сессии. Если сервлет теряет данные сессии, эти данные теряются для всех сервлетов их использующих. Вы должны также использовать методы перезаписи URL, если хотите, чтобы Ваш сервлет поддерживал клиентов, не работающих или не поддерживающих закладки.