Richtiges Session Management mit Servlets

Flot

Mitglied
Hallo,

ich habe eine Frage bezüglich des Session Management mit Servlets.

Innerhalb der Servlet Klasse ist es ja kein Problem die aktuelle Session zu bekommen.
Mit this.getThreadLocalRequest().getSession() erhält man wie erwartet seine Session.

Wie soll ich aber die Session innerhalb von anderen Klassen bekommen, ohne die Session durch alle Funktionen durchschleifen zu müssen?

Java:
public class GreetingServiceImpl extends RemoteServiceServlet{
     private ChatraumManager chatManager;
    
     public GreetingServiceImpl(){
		chatManager = new ChatraumManager();
     }
     //Derzeitige implementierung
     public void sendMsg(int raum_id, String nachricht) {
           String absender = this.getThreadLocalRequest().getSession().getId();
           chatManager.sendMsg(absender,raum_id, nachricht);
     }
     //Gewünschte Implementierung
     public void sendMsg(int raum_id, String nachricht) {
		chatManager.sendMsg(raum_id, nachricht);
     }
}
Es sollte sich in diesem Fall der ChatraumManager um das Setzen des Absenders kümmern und nicht das Servlet.
Meine Idee war es eine static CurrentUser Klasse zu schreiben, aber das funktioniert ja nicht, weil sich alle requests die selben Variablen teilen.

Um das ganze zu umschiffen würde mir nur noch eine Hash map mit Thread id und session einfallen,

ist aber meiner Meinung nach auch keine schöne Lösung, da ich dann in in jeder remoteService Funktion die eigene initSession() aufrufen müsste.

Bin für alle Tipps dankbar :)
 

Flot

Mitglied
Ich müsste ja bei jeder Funktion die ich dann schreibe auch die Session übergeben.

Das kann ja irgend wie nicht schön sein, und wenn ich es nur bei den nötigen mache,

kann später keiner etwas erweitern, da man dann doch wieder die Userinformation braucht.

Oder ist es üblich, dass ich im ganzen Funktionsstack dahinter eine Variable mit ziehe?
Sachimpfwortfilter, Spamfilter, usw.
 
Zuletzt bearbeitet:

Noctarius

Top Contributor
Alternativ ginge nur jedesmal eine eigene Instanz der Klasse mit der Business-Funktion zu instanzieren (bzw diese in einem ThreadLocal zu halten). Spontan wüsste ich sonst keinen Weg.
 

Flot

Mitglied
Hier mal meine Lösung, die an den jeweiligen Thread gebunden ist.

Das Servlet:
Java:
public class GreetingServiceImpl extends RemoteServiceServlet{
     private ChatraumManager chatManager;
    
     public GreetingServiceImpl(){
        chatManager = new ChatraumManager();
     }
     //Gewünschte Implementierung
     public void sendMsg(int raum_id, String nachricht) {
        initSession();
        chatManager.sendMsg(raum_id, nachricht);
     }
     private void initSession(){
	   MySessionHandler.initSession(this.perThreadRequest.get().getSession());
     }
}
Der Sessionhandler: Geändert: 22.01.2011 18:15
Java:
public class MySessionHandler {
	private static HashMap<Thread,HttpSession> sessions = new HashMap<Thread,HttpSession>();
	
	public synchronized static void initSession(HttpSession session){
		//Entfernen der toten Threads
		//notify wäre besser
		for(Thread t:sessions.keySet()){
			if(!t.isAlive()){
				sessions.remove(t);
			}
		}
    	MySessionHandler.sessions.put(Thread.currentThread(), session);
    }
	public synchronized static HttpSession getCurrentSession(){
    	return sessions.get(Thread.currentThread());
    }
}

Mit dieser Lösung kann man jetzt von überall aus MySessionHandler.getCurrentSession() aufrufen,
dafür muss man jetzt aber bei jeder RPC funktion initSession() aufrufen.

aber ca. 20x initSession() sollte ja noch immer besser sein als 200x die Session durch reichen zu müssen.

Muss jetzt nur noch herausfinden, wie ich threads richtig aus der Liste entferne, wenn sie fertig sind.

Und immer eigene Instanzen zu Instanzieren funktioniert auch nicht, da der ChatraumManager ja alle Chaträume kennen muss, um den andern Usern die Nachricht übermitteln zu können.

Spricht sonst noch etwas gegen meine Lösung, bzw. gibt es das wirklich nicht schon vorgefertigt?
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Gleiche Session von EJB Container in JSF Container verwenden? Web Tier 21
R Session löschen Web Tier 3
J Session ist nach Klick auf Zurück-Button wieder aktiv Web Tier 3
jann Servlet Bei jedem Request wird eine neue Session erstellt. Web Tier 6
J Session Servlet - JavaScript Web Tier 6
M Session closed - und nun? Web Tier 1
F JSF synchronized(session) Frage ? Web Tier 1
F JSF p:selectOneMenu Session Web Tier 10
T JSF Problem wenn Session abgelaufen ist Web Tier 6
Q JSF bei Session-Timeout Weiterleitung auf spezielle Login-Seite Web Tier 15
D JSF Überprüfen der Session ID in JSF und JAVA Web Tier 9
R Servlet Resource laden für SMTP - Session Web Tier 4
B JSF Mojarra 2.1.5: java.lang.IllegalStateException: Cannot create a session after the response has been Web Tier 7
R JSF Session Handling Web Tier 3
X JSP Auslesen der Daten einer Session Web Tier 3
X Managed Bean Scope zwischen Request und Session gesucht Web Tier 6
crashfinger JSP Session verloren bei DNS Servernamen & IE Web Tier 6
C session trackung auf einfacher web-site Web Tier 17
F JSF Session-Kolision Web Tier 3
R Zugriff auf Session direkt auf JSF-Seite Web Tier 2
H JSF Session Initialisierung Web Tier 2
E JSP Browser Tab Session Web Tier 7
F Session Tutorial Web Tier 5
T JSP Session Login - Sicherheit Web Tier 4
J Loginbereich mit Session und Datenbank Web Tier 5
M 2 Cookies in der session (cocoon 2.2) Web Tier 4
P JSP: Liste in Bean über Session aufbauen Web Tier 6
7 Struts+AJAX- Session-Handling? Web Tier 2
B JSF session bean mit worker thread updaten Web Tier 7
J Crash bei session timeout Web Tier 3
M session Speicherort - ID ändern Web Tier 8
V ANFÄNGER : eigene Session Web Tier 3
V DatenbankConnection an Session hängen Web Tier 4
P session.removeAttribute Web Tier 3
K Orientierungslosigkeit: Webservice+Ajax(echo2)+Session-Management Web Tier 4
O struts - Gültigkeit einer Action an Session binden?! Web Tier 4
D JSF: Best Practice "Session invalidate nach Schließen des Browsers"? Web Tier 3
T Unbegrenzte Session Web Tier 14
D tapestry 5 session Web Tier 2
J Struts 2 session ID auslesen? Web Tier 5
M [J2EE] Session-Save Static-Objects? Web Tier 6
S Problem mit Session - Übergabe von Kontext zu Kontext Web Tier 2
F JSF: Beans in Session oder Request? Web Tier 4
H JSF - Bean (scope session) - Verfallsdatum? Web Tier 3
T Problem bei Session-Timeout Web Tier 3
M JSF refresh vs. session scope Web Tier 9
G Session in Servlet Starten und mit JSTL auslesen Web Tier 2
G Servlet - Von Parametern umstellen auf Session Web Tier 8
G jsf session erstellen Web Tier 10
rambozola session attribut in servlets und jsps Web Tier 11
M JSF session.invalidate() klappt nicht Web Tier 3
G Session.invalide() funktioniert nicht richtig Web Tier 2
M JSF Framework für User Management etc. Web Tier 0

Ähnliche Java Themen

Neue Themen


Oben