encodeURL и encodeRedirectURL в Java-сервлетах

Часто так бывает, что клиент отключил cookies в браузере, а id сессии храниться в cookies, а как-то поддерживать сессию надо.

Выход есть. Для этого нужно закодировать URL-адрес с добавлением идентификатора сессии и прикрепленный к адресу id будет тем же самым, как если бы он хранился в cookies, только здесь в ссылке. То есть теперь клиент будет отправлять JSESIONID не из Cookies, а в ссылке при обращении к серверу.

Для этого применяется метод encodeURL. Он перекодирует адрес добавляя в него JSESSIONID. Используется в ссылках в самом сервлете.

encodeRedirectURL делает то же самое, только применяется при перенаправлении.

Как пример использования encodeURL, создадим программу, в которой при каждом нажатии на ссылку в аттрибут сессии будет добавляться строка.

В программе ниже используем в ссылке в сервлете метод encodeURL.

Если бы в приведённой ниже программе не использовался encodeURL, то при нажатии на ссылку EncUrlServlet к адресу http://localhost:8080/helloservlet добавлялся бы EncUrlServlet, и происходил бы переход на http://localhost:8080/helloservlet/EncUrlServlet.

Благодаря encodeURL в этот адрес еще будет добавляться и JSESSIONID.

Вот так:

http://localhost:8080/helloservlet/EncUrlServlet;jsessionid=83A1405652DB65133B5EFE68FFBB30F5

Пример программы:

import java.util.*; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import javax.servlet.annotation.*; @WebServlet(“/EncUrlServlet”) public class MyServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter pw = response.getWriter(); HttpSession sess = request.getSession(); //Извлекаем аттрибут someattr из сессии. //Далее будем добавлять к нему строку. String someattr = (String) sess.getAttribute(“someattr”); //По нажатию на ссылку обновляем аттрибут someattr. //К старому содержимому аттрибута someattr будет //добавляться _sessionIsWorking! что значит что сессия //работает. request.getSession().setAttribute(“someattr”,someattr+”_sessionIsWorking!”); //Используем в ссылке в сервлете метод encodeURL //чтобы в адрес добавлялся JSESSIONID pw.println(“someattr=”+someattr +”
EncUrlServlet“); } }

Проверка работы сервлета с encodeURL

Для начала отключим куки в браузере, так как нам нужно проверить будет ли работать сессия с отключенными куками. После этого куда-то отправляться или откуда-то приниматься кукам будет запрещено.

Скомпилируем файл сервлета и в адресной строке перейдем по адресу /EncUrlServlet.

Теперь нажмем на ссылку и посмотрим добавиться ли к адресу http://localhost:8080/helloservlet/EncUrlServlet хранящийся в куках JSESSIONID.

Видим, что в адрес добавился JSESSIONID.

Также видим, что к аттрибуту добавилась строка _sessionIsWorking!. Что значит, что сессия работает и в нее можно добавлять и извлекать из нее аттрибуты.

И это, ясное дело, благодаря методу encodeURL, который отправляет на сервер JSESSIONID в ссылке, благодаря чему сессия поддерживается.

Если бы мы убрали метод encodeURL, то ничего бы не происходило, так как сервер не смог бы получить JSESSIONID клиента.

Для примера также можем еще понажимать на ссылку и в адресе всё еще будет добавлен JSESSIONID, а к строке продолжит добавляться строка _sessionIsWorking!. То есть сессия всё еще работает.

Синхронизация в Java сервлете

Узнайте, как обеспечить потокобезопасность в Java сервлетах. Изучите работу с синхронизацией, deprecated SingleThreadModel и лучшие практики для многопоточных сервлетов.
Time to read: 12

Что такое Filter в Java сервлетах

Фильтры (Filter) в Java сервлетах: выполняйте код до и после обработки запроса. Пример реализации интерфейса Filter для предварительной авторизации и логирования.
Time to read: 14

Слушатели (Listeners) в Java сервлетах

Разберитесь с Listeners в Java сервлетах: отслеживайте изменения атрибутов, сессий и контекста. Практический пример использования ServletContextAttributeListener.
Time to read: 15