Zugriff auf ServletContext und HttpSession in @OnMessage einer JSR-356 @ServerEndpoint
Ich brauche, um die ServletContext
aus dem inneren einer @ServerEndpoint
um das zu finden, Frühjahr ApplicationContext
und Suche für eine Bean.
Für den moment meine beste Ansatz ist, zu binden, die bean im JNDI-Namenskontext und Suche es in der Endpoint
. Eine bessere Lösung ist willkommen.
Ich bin auch auf der Suche nach einer angemessenen Art und Weise zu Synchronisierung-servlet ist HttpSession
mit websocket ist Session
.
InformationsquelleAutor der Frage Sombriks | 2014-02-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Servlet
HttpSession
ist in JSR-356 erhältlichHandshakeRequest#getHttpSession()
die ihrerseits verfügbar, wenn ein handshake-Anforderung direkt vor@OnOpen
einer@ServerEndpoint
. DieServletContext
ist wiederum nur überHttpSession#getServletContext()
. Das sind zwei Fliegen mit einer Klappe.In um capture die handshake-Anfrage, implementieren Sie eine
ServerEndpointConfig.Konfigurator
und überschreiben Sie diemodifyHandshake()
Methode. DieHandshakeRequest
ist hier erhältlich als Methode argument. Sie können dieHttpSession
inEndpointConfig#getUserProperties()
. DieEndpointConfig
ist wiederum verfügbar als Methode argument@OnOpen
.Hier ein kickoff Beispiel der
ServerEndpointConfig.Configurator
Umsetzung:Hier ist, wie können Sie es verwenden, beachten Sie die
Konfigurator
Attribut des@ServerEndpoint
:Als design-Tipp, es ist am besten halten Sie Ihre
@ServerEndpoint
völlig frei von servlet-API-Abhängigkeiten. Sie würden in dermodifyHandshake()
Umsetzung sofort besser extrahieren genau dass Informationen (in der Regel eine veränderliche Javabean) die Sie benötigen, aus der servlet-Sitzungs-oder Kontext und setzen Sie Sie in den Benutzereigenschaften anzeigen statt. Wenn Sie das nicht tun, dann sollten Sie im Hinterkopf behalten, dass ein websocket-Sitzung kann länger Leben als der HTTP-session. Also, wenn Sie noch mit sich herumtragenHttpSession
in den Endpunkt, dann können SieIllegalStateException
wenn Sie versuchen, darauf zuzugreifen, während es wird abgelaufen.Falls du zufällig CDI (und vielleicht JSF) in die Hände, Sie können Holen Sie sich inspiration aus dem Quellcode von OmniFaces
<o:Buchse>
(links sind ganz unten in der Vitrine).Siehe auch:
InformationsquelleAutor der Antwort BalusC
Aktualisierten code für BalusC Antwort, die onOpen-Methode muss dekoriert werden, die mit @OnOpen. Dann gibt es keine Notwendigkeit mehr zu verlängern, die Endpoint-Klasse:
InformationsquelleAutor der Antwort hfmanson
Habe ich ausprobiert, BalusC Antwort auf Tomcat (Version 7.0.56 und 8.0.14). Auf den beiden Containern, die modifyHandshake die request-parameter nicht enthält eine HttpSession (und somit keine servletContext).
Da musste ich den servlet-Kontext nur zum Zugriff auf die "globalen" Variablen (web-Anwendung global), die ich gerade gespeichert, diese Variablen in einer normalen statischen Feld einer Halter-Klasse. Dies ist unelegant, aber es funktioniert.
Dass ooks wie ein Fehler in diesem bestimmten tomcat-Versionen - hat jemand da draußen auch gesehen?
InformationsquelleAutor der Antwort Wolfgang Liebich