encodeURL и encodeRedirectURL в Java сервлетах
Last updated: 10 мая 2025 г.Часто так бывает, что клиент отключил 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
Пример программы:
1import java.util.*;
2import java.io.IOException;
3import java.io.PrintWriter;
4
5import javax.servlet.ServletException;
6import javax.servlet.http.HttpServlet;
7import javax.servlet.http.HttpServletRequest;
8import javax.servlet.http.HttpServletResponse;
9import javax.servlet.http.HttpSession;
10import javax.servlet.annotation.*;
11
12@WebServlet("/EncUrlServlet")
13public class MyServlet extends HttpServlet {
14 protected void doGet(HttpServletRequest request,
15 HttpServletResponse response)
16 throws ServletException, IOException {
17 PrintWriter pw = response.getWriter();
18 HttpSession sess = request.getSession();
19 //Извлекаем аттрибут someattr из сессии.
20 //Далее будем добавлять к нему строку.
21 String someattr = (String) sess.getAttribute("someattr");
22 //По нажатию на ссылку обновляем аттрибут someattr.
23 //К старому содержимому аттрибута someattr будет
24 //добавляться _sessionIsWorking! что значит что сессия
25 //работает.
26 request.getSession().setAttribute("someattr",someattr+"_sessionIsWorking!");
27 //Используем в ссылке в сервлете метод encodeURL
28 //чтобы в адрес добавлялся JSESSIONID
29 pw.println("<body>someattr="+someattr
30 +"<br><a href='"+response.encodeURL("EncUrlServlet")
31 +"'>EncUrlServlet</a></body>");
32 }
33}
Проверка работы сервлета с encodeURL
Для начала отключим куки в браузере, так как нам нужно проверить будет ли работать сессия с отключенными куками. После этого куда-то отправляться или откуда-то приниматься кукам будет запрещено.
Скомпилируем файл сервлета и в адресной строке перейдем по адресу /EncUrlServlet
.

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

Видим, что в адрес добавился JSESSIONID.
Также видим, что к аттрибуту добавилась строка _sessionIsWorking!
. Что значит, что сессия работает и в нее можно добавлять и извлекать из нее аттрибуты.
И это, ясное дело, благодаря методу encodeURL
, который отправляет на сервер JSESSIONID в ссылке, благодаря чему сессия поддерживается.
Если бы мы убрали метод encodeURL
, то ничего бы не происходило, так как сервер не смог бы получить JSESSIONID клиента.
Для примера также можем еще понажимать на ссылку и в адресе всё еще будет добавлен JSESSIONID, а к строке продолжит добавляться строка _sessionIsWorking!
. То есть сессия всё еще работает.

Следующие уроки
Синхронизация в Java сервлете
12
мин.
Что такое Filter в Java сервлетах
14
мин.
Слушатели (Listeners) в Java сервлетах
15
мин.