У меня есть ситуация, когда у меня есть два разных веб-приложения, работающих на одном сервере с использованием разных портов. Они оба используют контейнер сервлетов Java Jetty, поэтому они оба используют параметр cookie с именем JSESSIONID для отслеживания идентификатора сеанса. Эти два веб-приложения борются за идентификатор сеанса.
- Откройте вкладку Firefox и перейдите в WebApp1.
- HTTP-ответ WebApp1 имеет заголовок set-cookie с JSESSIONID=1.
- Firefox теперь имеет заголовок Cookie с JSESSIONID=1 во всех своих HTTP-запросах к WebApp1.
- Откройте вторую вкладку Firefox и перейдите в WebApp2.
- HTTP-запрос к WebApp2 также имеет заголовок Cookie с JSESSIONID=1, но в doGet, когда я вызываю
req.getSession(false);
, я получаюnull
. И если я вызовуreq.getSession(true)
, я получу новый объект Session, но тогда ответ HTTP от WebApp2 будет иметь заголовок set-cookie с JSESSIONID=20. - Теперь у WebApp2 есть рабочий сеанс, но сеанс WebApp1 отсутствует. Переход к WebApp1 даст мне новый сеанс, сметая сеанс WebApp2.
- Продолжить навсегда
Таким образом, сеансы бьются между каждым веб-приложением. Мне бы очень хотелось, чтобы req.getSession(false)
возвращал действительный сеанс, если уже определен файл cookie JSESSIONID.
Один из вариантов состоит в том, чтобы в основном переопределить инфраструктуру сеанса с помощью HashMap и файлов cookie с именами WEBAPP1SESSIONID и WEBAPP2SESSIONID, но это отстой, и это означает, что мне придется взломать новый материал Session в ActionServlet и в нескольких других местах.
Это должно быть проблемой, с которой столкнулись другие. HttpServletRequest.getSession(boolean)
Джетти просто дерьмовый?