Widziałem kilku programistów szukających rozwiązania tego problemu: uzyskiwanie dostępu do informacji o sesji z innej WAR (nawet gdy znajduje się w tym samym pliku EAR) - oto kilka przykładów: Jak można udostępnić stan sesji między różnymi aplikacjami w tomcat? , Sesja dostępu do innej aplikacji internetowej , różne pliki WAR, udostępnione zasoby , Tomcat: jak współdzielić dane między dwiema aplikacjami? , Co robi atrybut crossContext w Tomcat? Czy umożliwia udostępnianie sesji? i tak dalej...
Ze wszystkiego, co szukałem, istnieją pewne konkretne rozwiązania w zależności od pojemnika, ale jest to w jakiś sposób „ sprzeczne ze specyfikacją ”. Przejrzałem także specyfikację Java EE, ale bez powodzenia w znalezieniu odpowiedzi.
Niektórzy programiści mówią o sprzężeniu między aplikacjami internetowymi, ale zwykle się nie zgadzam. Jaki jest powód, dla którego WOF trzymane byłyby w tym samym EAR, gdyby nie były sprzężone? Na przykład do EJB można uzyskać dostęp lokalnie (nawet jeśli znajduje się w innym pliku JAR EJB w tym samym pliku EAR).
Mówiąc dokładniej, jedna z moich WAR obsługuje uwierzytelnianie i autoryzację, i chciałbym udostępnić te informacje innym WAR (w tym samym EAR). Wcześniej udało mi się obejść podobne problemy, pakując WARs jako JAR i umieszczając je w jednym projekcie WAR (WEB-INF / lib). Jednak nie podoba mi się to rozwiązanie (wymaga ogromnego wysiłku nazywania serwletów i tak dalej).
I żadne rozwiązanie nie odpowiedziało na pierwsze (i najważniejsze) pytanie: Dlaczego WARs nie może udostępniać informacji o sesji?
źródło
Odpowiedzi:
Traktuj EAR jak maszynę pseudo-wirtualną
Plik EAR to po prostu zbiór plików WAR, które mają wspólną konfigurację i biblioteki, zwykle z plików JAR. Umożliwia to łatwiejsze zarządzanie zestawem usług zależnych w kontenerze aplikacji. Dlatego można myśleć o EAR jako o prostej formie maszyny wirtualnej po wdrożeniu w jej kontenerze.
W ten sam sposób, w jaki jeden proces na maszynie wirtualnej nie może wpływać na inny, to samo dotyczy EAR. Wszystkie WAR są izolowane, aby chronić ich stan wewnętrzny.
Skalowanie uwierzytelnienia
Zasadniczo aplikacje internetowe muszą być bezstanowe, aby można je było dobrze skalować. Posiadanie dużej ilości informacji w sesji jest anty-wzorcem, który temu zapobiega. Prowadzi to do konfliktu między bezstanowym charakterem HTTP a potrzebą zachowania szybkiego, dostosowanego do potrzeb użytkownika. Uwierzytelnianie jest klasycznym przypadkiem użycia i jest powszechne w gadatliwych interfejsach API, które wymagają wielu uwierzytelnionych żądań w celu zapewnienia funkcjonalności dla użytkownika końcowego.
Pojedyncze logowanie i pojedyncze logowanie wymagają starannej sygnalizacji, aby działać poprawnie (rozważ częściowe wylogowanie), szczególnie gdy jest stosowane skalowanie poziome. Po prostu udostępnianie stanu sesji prawie nigdy nie jest dobrym rozwiązaniem, a lepszym podejściem jest użycie jednego punktu odniesienia dla informacji o użytkowniku, do których mają dostęp wszystkie węzły w klastrze.
Skoncentrowanie się na szybkim dostępie do odpowiednich informacji w pamięci podręcznej przyniesie znacznie bardziej skalowalne wyniki niż niektóre złożone, delikatne rozwiązanie do udostępniania sesji.
źródło
Wydaje mi się, że brakuje w tym specyfikacji funkcjonalności JEE EAR - możliwości udostępniania sesji internetowych w wielu archiwach internetowych powiązanych w pliku EAR.
Serwery aplikacji, takie jak Weblogic, mają implementacje niestandardowe dla tej funkcji.
źródło
AFAIKS, nie ma prawdziwego powodu, dla którego chciałbyś to zrobić. WAR to niezależna aplikacja internetowa z własnymi zakresami (specyficznymi dla aplikacji internetowych) (np. Zasięg sesji). Jeśli chcesz współdzielić funkcje (kod Java, strony JSP, pliki CSS), pomiędzy wieloma WARami masz o wiele bardziej sensowną opcję pakowania ich jako plików JAR i wdrażania ich na serwerze aplikacji. Pakiet WAR jest bardziej złożonym rozwiązaniem do pakowania, zaprojektowanym tak, aby zawierało coś innego niż zwykły „wspólny kod / funkcjonalność”. JAR jest prostszym formatem ORAZ jest przeznaczony do pakowania i udostępniania kodu i funkcjonalności. Dlaczego chcesz korzystać z bardziej złożonego i niespecyficznie zaprojektowanego do tego opakowania, aby udostępnić coś, skoro masz już prostszy i bardziej odpowiedni format pakietu, który jest już dostępny.
źródło
Myślę, że zostało to zrobione celowo, aby uniknąć przypadkowego zastąpienia informacji o sesji przez różne aplikacje internetowe. Może się to przydać w twoim przypadku, ale ogólnie rzecz biorąc, nie chcesz, aby użytkownicy powodowali awarię aplikacji lub zwiększali swoje uprawnienia tylko dlatego, że korzystają z dwóch aplikacji internetowych jednocześnie. Bezpośrednie udostępnianie informacji między aplikacjami internetowymi nie jest trudne; po prostu stwórz klasę ze statyczną HashMap, użyj GUID jako kluczy i przenieś je jako część parametru URL lub HTTP.
źródło