Ich habe mehrere Entwickler gesehen, die nach einer Lösung für dieses Problem gesucht haben: Zugriff auf Sitzungsinformationen aus einem anderen WAR (auch wenn sie sich in derselben EAR befinden) - hier einige Beispiele: Gibt es eine Möglichkeit, den Sitzungsstatus zwischen verschiedenen Anwendungen in Tomcat zu teilen? , Zugriffssitzung einer anderen Webanwendung , verschiedene WAR-Dateien, freigegebene Ressourcen , Tomcat: Wie kann ich Daten zwischen zwei Anwendungen austauschen? , Was macht das Attribut crossContext in Tomcat? Aktiviert es die Sitzungsfreigabe? und so weiter...
Nach allem, was ich gesucht habe, gibt es je nach Container einige spezifische Lösungen, aber es widerspricht irgendwie der Spezifikation . Ich habe auch die Java EE-Spezifikation durchgesehen, ohne Glück, eine Antwort zu finden.
Einige Entwickler sprechen über die Kopplung zwischen Webanwendungen, aber ich bin eher anderer Meinung. Was ist der Grund, warum man WARs innerhalb derselben EAR halten würde, wenn man nicht koppelt? Auf EJBs kann beispielsweise lokal zugegriffen werden (auch wenn sie sich in einer anderen EJB-JAR innerhalb derselben EAR befinden).
Insbesondere übernimmt eine meiner WARs die Authentifizierung und Autorisierung, und ich möchte diese Informationen mit anderen WARs (in derselben EAR) teilen. Ich habe es zuvor geschafft, ähnliche Probleme zu umgehen, indem ich WARs als JARs verpackt und in ein einzelnes WAR-Projekt (WEB-INF / lib) eingefügt habe. Diese Lösung gefällt mir jedoch nicht (sie erfordert einen enormen Aufwand bei der Benennung von Servlets usw.).
Und keine Lösung hat die erste (und wichtigste) Frage beantwortet: Warum können WARs keine Sitzungsinformationen austauschen?
quelle
Antworten:
Behandeln Sie eine EAR wie eine pseudo-virtuelle Maschine
Eine EAR ist einfach eine Sammlung von WAR-Dateien, die gemeinsame Konfigurationen und Bibliotheken verwenden, normalerweise von JARs. Auf diese Weise kann eine Sammlung von voneinander abhängigen Diensten einfacher in einem Anwendungscontainer verwaltet werden. Daher können Sie sich eine EAR als einfache Form einer virtuellen Maschine vorstellen, sobald sie in ihrem Container bereitgestellt wird.
Ebenso wie ein Prozess auf einer virtuellen Maschine keinen anderen beeinflussen kann, gilt dies auch für eine EAR. Alle WARs sind isoliert, um ihren internen Zustand zu schützen.
Skalieren der Authentifizierung
Im Allgemeinen müssen Webanwendungen zustandslos sein, um eine gute Skalierung zu gewährleisten. Viele Informationen in der Sitzung zu haben, ist ein Anti-Muster, das dies verhindert. Dies führt zu einem Konflikt zwischen der Statuslosigkeit von HTTP und der Notwendigkeit, eine schnelle, angepasste Benutzererfahrung aufrechtzuerhalten. Die Authentifizierung ist ein klassischer Anwendungsfall und wird häufig in Chat-APIs verwendet, für die viele authentifizierte Anforderungen erforderlich sind, um Endbenutzerfunktionen bereitzustellen.
Single Sign On und Single Sign Off erfordern eine sorgfältige Signalisierung, um korrekt zu funktionieren (teilweise Abmeldung berücksichtigen), insbesondere wenn eine horizontale Skalierung vorhanden ist. Das einfache Teilen des Sitzungsstatus ist fast nie eine gute Lösung. Ein besserer Ansatz besteht darin, einen einzigen Bezugspunkt für die Benutzerinformationen zu verwenden, auf die alle Knoten im Cluster Zugriff haben.
Wenn Sie sich auf den schnellen zwischengespeicherten Zugriff auf relevante Informationen konzentrieren, erhalten Sie weitaus skalierbarere Ergebnisse als bei einer komplexen, fragilen Lösung für die gemeinsame Nutzung von Sitzungen.
quelle
Ich denke, es fehlt etwas an Funktionalität in der JEE EAR-Spezifikation - die Möglichkeit, Websitzungen über mehrere innerhalb einer EAR gebundene Webarchive hinweg zu teilen.
App-Server wie Weblogic haben nicht standardmäßige Implementierungen für diese Funktionalität.
quelle
Nun, AFAIKS, es gibt keinen wirklichen Grund, warum Sie dies tun möchten. Ein WAR ist eine eigenständige Webanwendung mit eigenen (webanwendungsspezifischen) Bereichen (wie dem Sitzungsbereich). Wenn Sie Funktionen (Java-Code, JSP-Seiten, CSS-Dateien) gemeinsam nutzen müssen, haben Sie zwischen mehreren WARs die weitaus sinnvollere Möglichkeit, sie als JAR-Dateien zu verpacken und auf Ihrem Anwendungsserver bereitzustellen. Ein WAR-Paket ist eine komplexere Verpackungslösung, die etwas anderes als einfachen "allgemeinen Code / Funktionalität" enthält. Die JAR ist ein einfacheres Format UND dient zum Packen und Freigeben von Code und Funktionen. Warum sollten Sie eine komplexere und nicht speziell für diese Verpackung entwickelte Verpackung verwenden, um etwas gemeinsam zu nutzen, wenn Sie bereits ein einfacheres und für dieses Paket geeigneteres Paketformat zur Verfügung haben?
quelle
Ich denke, dies wurde absichtlich gemacht, um zu vermeiden, dass verschiedene Web-Apps versehentlich die Sitzungsinformationen der anderen überschreiben. In Ihrem Fall mag dies nützlich sein, aber im Allgemeinen möchten Sie nicht, dass Benutzer die App zum Absturz bringen oder ihre Berechtigungen erweitern, nur weil sie zwei Web-Apps gleichzeitig verwenden. Es ist nicht gerade schwierig, Informationen explizit zwischen Web-Apps auszutauschen. Erstellen Sie einfach eine Klasse mit einer statischen HashMap, verwenden Sie GUIDs als Schlüssel und übertragen Sie sie als Teil des URL- oder HTTP-Parameters.
quelle