2010-08-17 6 views
17

Non sembra che HttpServletResponse esponga alcun metodo per farlo.Esiste un modo per leggere i cookie dall'oggetto risposta in Java?

In questo momento, sto aggiungendo un po 'di codice di registrazione a un servlet crudele e mal capito, nel tentativo di capire che cosa fa esattamente. So che imposta un sacco di biscotti, ma non so quando, perché, o cosa. Sarebbe bello registrare tutti i cookie nell'oggetto HttpServletResponse alla fine dell'esecuzione del servlet.

So che i cookie sono in genere responsabilità del browser e ricordo che non c'era modo di farlo in .NET. Spero solo che Java possa essere diverso ...

Ma se questo non è possibile - qualche altra idea su come realizzare ciò che sto cercando di fare?

Grazie, come sempre.

risposta

5

L'unico approccio è racchiudere l'oggetto HttpServletResponse in modo che i metodi addCookie possano intercettare e registrare quando vengono impostati i cookie. È possibile farlo aggiungendo un ServletFilter che avvolge l'HttpServletResponse esistente prima che venga passato nel Servlet.

14

Se la registrazione è tutto ciò che cercate, allora vi consiglio di scrivere Un'implementazione di javax.servlet.Filter che avvolge la dotazione HttpServletResponse in un involucro che consente di esporre i biscotti dopo il filtro viene eseguito. Qualcosa di simile a questo:

public class CookieLoggingFilter implements Filter { 

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException ,ServletException { 
     ResponseWrapper wrappedResponse = new ResponseWrapper((HttpServletResponse) response); 

     filterChain.doFilter(request, wrappedResponse); 

     // use a real logger here, naturally :) 
     System.out.println("Cookies: " + wrappedResponse.cookies); 
    } 

    private class ResponseWrapper extends HttpServletResponseWrapper { 

     private Collection<Cookie> cookies = new ArrayList<Cookie>(); 

     public ResponseWrapper(HttpServletResponse response) { 
      super(response); 
     } 

     @Override 
     public void addCookie(Cookie cookie) { 
      super.addCookie(cookie); 
      cookies.add(cookie); 
     } 
    } 

     // other methods here 
} 

Una grande avvertimento: Questo sarà non si mostrare ciò che i cookie vengono inviati al browser, sarà solo mostrerà quali cookie il codice dell'applicazione aggiunto alla risposta. Se il contenitore sceglie di modificare, aggiungere o ignorare tali cookie (ad esempio i cookie di sessione sono gestiti dal contenitore, non dall'applicazione), non si conoscerà l'utilizzo di questo approccio. Ma potrebbe non essere importante per la tua situazione.

L'unico modo per essere certi è utilizzare un plug-in del browser come Live Http Headers for Firefox o un proxy di registrazione HTTP man-in-the-middle.

+0

forse mi manca qualcosa ... Perché non puoi estendere la registrazione standard del tuo contenitore (ad es. 'AccessLogValve' di Tomcat) e filtrare le intestazioni di risposta alla ricerca di' Set-Cookie's per accedere? Questo dovrebbe consentire di registrare i cookie definitivi impostati nel browser. –

8

Ho avuto lo stesso problema in cui stavo usando una libreria di terze parti che accetta un HttpServletResponse e avevo bisogno di leggere i cookie che ha impostato sul mio oggetto risposta. Per risolvere che ho creato un'estensione HttpServletResponseWrapper che espone questi cookie per me dopo aver fatto la chiamata:

public class CookieAwareHttpServletResponse extends HttpServletResponseWrapper { 

    private List<Cookie> cookies = new ArrayList<Cookie>(); 

    public CookieAwareHttpServletResponse (HttpServletResponse aResponse) { 
     super (aResponse); 
    } 

    @Override 
    public void addCookie (Cookie aCookie) { 
     cookies.add (aCookie); 
     super.addCookie(aCookie); 
    } 

    public List<Cookie> getCookies() { 
     return Collections.unmodifiableList (cookies); 
    } 

} 

E il modo in cui lo uso:

// wrap the response object 
CookieAwareHttpServletResponse response = new CookieAwareHttpServletResponse(aResponse); 

// make the call to the 3rd party library 
String order = orderService.getOrder (aRequest, response, String.class); 

// get the list of cookies set 
List<Cookie> cookies = response.getCookies();