# Cookie beim erstem Zugriff auf Web-App ablegen



## ByteArray (5. Jan 2012)

Hallo,

ich bin ein Neuling in Sachen Java EE und habe folgende Frage:

Sobald ein User zum allerersten Mal auf die Web-Applikation (z.B. "index.jsp") aufruft, möchte ich eine Cookie beim User anlegen, welches eine Session-ID-Copy beinhaltet. Das klappt jedoch bisher bei mir garnicht. Die Cookie wird garnicht beim User erstellt.

Ich habe es versucht unter einem Session-Filter mit folgendem Listing-Fragment, ohne Erolg:


```
...

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

	if(session.isNew()) {

		Cookie cookie = new Cookie("SESSION_ID_COPY", session.getId());
		cookie.setMaxAge(60 * 60 * 24 * 365);
		
		response.addCookie(cookie);
	}

	chain.doFilter(request,response);
}
...
```

Entweder habe ich von Grund auf etwas falsch verstanden oder ich kenne keine weitere Implementation dazu.

Es wäre sehr sehr hilfreich, wenn irgendjemand mir dabei auf die Sprünge helfen würde, denn ich bin mit meinem Nerven am Ende!


----------



## nillehammer (5. Jan 2012)

> Ich habe es versucht unter einem Session-Filter


Sowas jibbet nicht. Dein Code sieht wie die Implementierung von javax.servlet.Filter aus. Abgesehen davon kompiliert der hinten und vorne nicht. Aber er war ja wohl auch nur gedacht, zu zeigen, was Du möchtest.

Das Grundsatzproblem ist, dass das Filter Interface mit den Klassen von javax.servlet arbeitet und nicht mit deren Spezialisierungen aus javax.servlet.http. Du willst aber mit Http-Spezialitäten (Sesstion, Cookies) arbeiten. Ich habe wirklich lange gesucht, ob es auch sowas wie einen HTTP-Filter gibt oder andere Punkte, an denen man ansetzen könnte. Was passendes gefunden hab ich allerdings nicht. Deswegen habe ich folgenden (nicht ganz eleganten und ungetesteten) Vorschlag:

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

    if ( request instanceof HttpServletRequest && response instanceof HttpServletResponse ) {
       addCookieIfSessionNew( (HttpServletRequest ) request, (HttpServletResponse) response);
    }

    chain.doFilter(request,response);
}

private void addCookieIfSessionNew(HttpServletRequest request, HttpServletResponse response) {

  final HttpSession session = request.getSession(false);

  if ( session != null && session.isNew() ) {
    
    final Cookie cookie = new Cookie("SESSION_ID_COPY", session.getId());
        cookie.setMaxAge(60 * 60 * 24 * 365);
        
        response.addCookie(cookie);
  }
}
```

Zu beachten ist, dass Filter in der Reihenfolge der Schrittte der Bearbeitung eises Requests durch den Container relativ weit vorne kommen. D.h. es kann sein, dass zu diesem Zeitpunkt der Bearbeitung noch keine HttpSession erzeugt wurde, sie es aber im weiteren Verlauf wird.


----------



## ByteArray (5. Jan 2012)

nillehammer hat gesagt.:


> Sowas jibbet nicht. Dein Code sieht wie die Implementierung von javax.servlet.Filter aus. Abgesehen davon kompiliert der hinten und vorne nicht. Aber er war ja wohl auch nur gedacht, zu zeigen, was Du möchtest.
> 
> Das Grundsatzproblem ist, dass das Filter Interface mit den Klassen von javax.servlet arbeitet und nicht mit deren Spezialisierungen aus javax.servlet.http. Du willst aber mit Http-Spezialitäten (Sesstion, Cookies) arbeiten. Ich habe wirklich lange gesucht, ob es auch sowas wie einen HTTP-Filter gibt oder andere Punkte, an denen man ansetzen könnte. Was passendes gefunden hab ich allerdings nicht. Deswegen habe ich folgenden (nicht ganz eleganten und ungetesteten) Vorschlag:
> 
> ...



Vielen Dank für das Beispiel, jedoch habe ich auch sowas ähnliches probiert und es lief, jedoch die Cookie wurde trotzdem garnicht angelegt beim allererstem Zugriff auf die Web-Applikation. Erst beim zweitem aufruf der Web-Appliaktion wird die Cookie mit:


```
...

if(session.isNew() == false) {

Cookie cookie = new Cookie(...);

response.addCookie(cookie);

}
```

angelegt, wieso?

Beim allererstem Zugriff auf die Website wird ja schließlich eine Session-ID erstellt (auch die Cookie mit "JSESSIONID") und die JSession-Cookie sofort angelegt. Dabei will ich gleichzeitig (gleich beim allerstem Request) eine Cookie mitablegen, damit ich z.B. beim nächsten Zugriff auf die Webseite den Userdaten oder Warenkorb mit der alten Session-ID-Cookie vergleichen und mit der Datenbank weiter interagieren kann.

So könnte ich beim nächstem Request die Userdaten, wie Logindaten authentifizieren oder den Warenkorb per alten gespeicherten Session-ID-Copy-Cookie mit Datenbank-Backend deserialisieren/wiederherstellen/wiedererkennen.

Dabei dachte ich, dass ich mit einem Session-Filter soetwas realisieren könnte, um unteranderem auch beim jeden Request sicherstellen kann, dass die abgelegten Userdaten richtig sind (als Sicherheitsfunktion beispielweise) und die den Warenkorb mit der alten und neuen Session-ID-Cookie wiedererkennen/wiederherstellen kann.

Noch weitere Ideen?


----------



## ByteArray (9. Jan 2012)

Ich habe es nach vielen Tagen endlich gefunden!

Ich habe innerhalb meiner SessionFilter-Klasse instanzierend auf eine eigene CookieVerarbeitungs-Klasse zugegriffen, wobei ganz oben im Quellcode bei der Klassenangabe folgende Angabeendung fehlte: 

"public class CookieManager *extends HttpServlet*"

Damit kann ich sofort beim allerersten und späteren Zugriffen (Requests) immer jenachdem eine weitere Cookie gleichzeitig, neben der standartmäßigen angelegten Cookie "JSESSIONID" anlegen.


----------

