# Sessions - Unterschiedlich in verschiedenen Klassen?



## Luxury (7. Sep 2011)

Hallo,

ich beschreibe erstmal kurz was ich erreichen will und anschließend das eigentliche Problem:

Ich will in einer Web-Applikation die Anzahl der eingeloggten Besucher, sowie deren Namen anzeigen lassen. Dazu habe ich einen "SessionListener" erstellt, der mir die erstellten Sessions samt ihrer Id in einer Map speichert:


```
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class SessionListener implements HttpSessionListener {

	public static Map<String, HttpSession> sessions = new HashMap<String, HttpSession>();
	
	@Override
	public void sessionCreated(HttpSessionEvent se) {
		
		HttpSession session = se.getSession();
		sessions.put(session.getId(), session);
		System.out.println("session id "+session.getId());
		
	}

	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
		sessions.remove(se.getSession().getId());
	}
	
	public static Map<String, HttpSession> getSessions(){
		return sessions;
	}

}
```

Dann habe ich eine Klasse, die den Usernamen/das Password überprüft. Diese Klasse erbt von "Filter" und hat somit die Methode "doFilter", die den Namen nach erfolgreichem Überprüfen in der Session speichert.

```
public void doFilter(ServletRequest request, ServletResponse response,
         FilterChain chain) throws IOException, ServletException {

      HttpServletRequest httprequest = (HttpServletRequest)_request;
       httprequest.getSession(true).setAttribute( "name", "abc" );


}
```

Wenn ich mir nun aber die Map vom "SessionListener" hole, haben die Sessions nicht die Variable "name" gespeichert, was wohl darauf zurückzuführen ist, dass die session.getId() in den beiden Klassen unterschiedlich ist. Kann mir jemand erklären, warum das nicht die gleiche Sessions in den beiden Klassen ist? Ich grübel hier schon den ganzen Tag herum und komme nicht drauf.

Viele Grüße
Luxury


----------



## SlaterB (7. Sep 2011)

mit Map und speziell 'unterschiedliche Klassen' musst du dann doch gar nicht anfangen,
rede ganz einfach über den Lebenslauf einer Session, gar nur innerhalb eines Request,

du hast eine leere Webapplikation und einen User der einen ersten Request macht,
als erstes kommt sicherlich der SessionListener dran, da hast du günstigerweise schon eine Log-Ausgabe, 
gibst die Id aus, außerdem setze dort irgendein Info in die Session, meinetwegen "x"="y",

dann kommen der Filter und später noch das Servlet und was auch immer dran,
viel Code ist davon noch nicht zu sehen, etwa nichts zur Map, aber die wie gesagt erstmal weglassen, 
nur z.B. wieder die Id ausgeben, die ist jetzt wirklich anders, ist das deine Aussage?
du hast keinen anderen Nutzer oder sonst irgendwelche Interfrerenzen, sondern nur einen Request mit annehmbarer Reihenfolge,
und die Id-Ausgabe ist nicht überall gleich?
wie sieht es als zweites Standbein mit dem zuvor eingefügten "x"-Attribut, ist das weg?
wenn ja dann ist wirklich irgendwas kaputt, dann wird die Session resettet oder ähnliches, da kann ich erstmal nichts zu sagen,
außer allgemein: sowas nicht selbst versuchen sondern immer erst ein funktionierendes Tutorial mit fertiger Anwendung finden, 
in welcher Session funktioniert

wenn aber das "x"-Attribut noch da ist, dann müsste Id eigentlich auch klappen, könnte letztlich aber egal sein,
dann speichere selber im SessionListener die Id als ein Attribut und nimm immer dieses, egal was getId() liefert


----------



## Luxury (8. Sep 2011)

Hallo,

leider kann ich kein bestehendes Beispiel benutzen, da ich die Funktionalität in ein vorhandenes Projekt einbauen will.

Also erst, wird der "SessionListener" aufgerufen, danach der "Filter". Das "x", welches ich im SessionListener gesetzt habe, ist im Filter nichtmehr vorhanden.  Ich habe schon untersucht, ob die Session zurückgesetzt wird, indem ich den source code nach "invalidate()" durchsucht habe. Aber ohne Erfolg. Gibt es andere Möglichkeiten, wie die Session zurückgesetzt werden kann?
Oder gibt es eine Möglichkeite die Sessions zu monitoren? Gibts da eine Möglichkeit in eclipse oder so?

Viele Grüße


----------



## SlaterB (8. Sep 2011)

du bekommst kein zweites sessionCreated()-Event?
und wohl auch kein sessionDestroyed() für die erste Session?
denn an sich ist ja der SessionListener ziemlich gut für diese Untersuchung geeignet,

woran das liegen kann kann ich persönlich leider nur schwer raten, z.B. an Dingen wie keine Cookies im Client erlaubt, 
aber dann sollte es doch zumindest für einen Request funktionieren, inklusive immer noch funktionierenden Dingen wie 
nachvollziehbaren sessionCreated() + sessionDestroyed()

grundsätzlich ist meine Einstellung dazu auch: das ist eine fremde API, eine Blackbox, dass die nicht funktioniert ist ganz normal,
es sei denn es gibt irgendwo ein Tutorial welches zeigt, wie man es sinnvoll verwenden kann, entweder dies funktioniert, erst dann kann man die erste eigene Codezeile schreiben,
oder das Tutorial geht nicht, dann mag es an eigenen Einstellungen liegen, nicht schön, schlimm genug bzw. noch schlimmer, aber dann braucht man zumindest hier keinen eigenen Code posten..

> leider kann ich kein bestehendes Beispiel benutzen 
ist dahingehend schwer nachvollziehbar

> da ich die Funktionalität in ein vorhandenes Projekt einbauen will.
bietet dagegen ein bisschen Hoffnung,
gehe zurück zum Ursprung, ohne eigene Filter, Listener oder sonstwas komisches einzubauen,
funktioniert diese Anwendung an sich? wird dabei Session verwendet bzw. wenn du nur System.out.println einbaust,
funktioniert dort die Session, etwa über mehrere Requests hinweg wenn es bisher keine Filter oder vergleichbares gibt?

-----

ganz allgemein kann man sich noch überlegen, manche Dinge selber einzubauen, z.B. die Session separat über eigene statische Maps umzusetzen, 
Filter einfach selber zu Beginn geeigneter Servlets aufrufen usw.,
aber das ist gewiss keine erstrebenswerte Richtung


----------



## Luxury (9. Sep 2011)

Ich habe das Problem gelöst. Ja es wurde aus irgend einem Grund zweimal eine Session erzeugt, da ich den Listener in der falschen web.xml eingetragen hatte. Das Projekt wird aus mehreren Projekten zusammenkopiert (während dem build-Prozess). Aber danke für die Hinweise!


----------

