Mam sytuację, w której mam dwa różne aplikacje działające na jednym serwerze, używające różnych portów. Oboje uruchamiają kontener serwletu Java Jetty, więc używają parametru cookie o nazwie JSESSIONID do śledzenia identyfikatora sesji. Te dwie aplikacje internetowe walczą o identyfikator sesji.Kolizja JSESSIONID między dwoma serwerami na tym samym ip ale różnych portach
- Otwórz zakładkę Firefox i przejdź do WebApp1
- odpowiedzi HTTP WebApp1 zawiera nagłówek set-ciasteczka z JSESSIONID = 1
- Firefox ma teraz nagłówek Cookie z JSESSIONID = 1 w sumie to żądania HTTP do WebApp1
- Otwórz druga zakładka Firefox i przejdź do WebApp2
- reqeust HTTP WebApp2 posiada również nagłówek Cookie z JSESSIONID = 1, ale w doGet, gdy zgłoszę
req.getSession(false);
uzyskaćnull
. A jeśli zadzwonię pod numerreq.getSession(true)
otrzymam nowy obiekt Session, ale wtedy odpowiedź HTTP z WebApp2 ma nagłówek set-cookie z JSESSIONID = 20 - Teraz WebApp2 ma działającą sesję, ale sesja WebApp1 zniknęła. Przechodzenie do WebApp1 da mi nową sesję, dezorientując sesję WebApp2.
- trwać wiecznie
Więc Sesje są lanie od każdej aplikacji internetowej. Naprawdę chciałbym, aby req.getSession(false)
zwrócił prawidłową sesję, jeśli zdefiniowano już plik cookie JSESSIONID.
Jedną z opcji jest zasadniczo ponowne zaimplementowanie struktury sesji za pomocą HashMap i ciasteczek o nazwie WEBAPP1SESSIONID i WEBAPP2SESSIONID, ale to jest do bani i oznacza, że będę musiał zhakować nowe rzeczy z sesji w ActionServlet i kilka innych miejsc.
To musi być problem, z którym inni się spotkali. Czy Jetty's HttpServletRequest.getSession(boolean)
jest po prostu brzydki?
Moim problemem jest to, że kiedy Jetty idzie do tworzenia nowej sesji, domyślnie, to nawet nie starają się wykorzystać istniejącą wartość JSESSIONID. Po prostu wybiera dla niego nową wartość. Jeśli ponownie używał istniejących, wtedy moje dwa egzemplarze Jetty mogłyby grać ładnie. –