2010-08-17 19 views
17

No parece que HttpServletResponse expone ningún método para hacer esto.¿Hay alguna forma de leer las cookies del objeto de respuesta en Java?

En este momento, estoy añadiendo un montón de código de registro en un servlet enrevesada y mal entendida, en un intento de averiguar qué es exactamente lo que hace. Sé que pone un montón de galletas, pero no sé cuándo, por qué ni qué. Sería bueno simplemente registrar todas las cookies en el objeto HttpServletResponse al final de la ejecución del servlet.

sé que las galletas son típicamente responsabilidad del navegador, y recuerdo que no había manera de hacer esto en .NET. Sólo la esperanza de que Java puede ser diferente ...

Pero si esto no es posible - cualquier otra idea de cómo llevar a cabo lo que estoy tratando de hacer?

Gracias, como siempre.

Respuesta

5

Su único enfoque es envolver el objeto HttpServletResponse por lo que los métodos addCookie pueden interceptar y registrar cuando se fijan cookies. Puede hacer esto agregando un ServletFilter que envuelve el HttpServletResponse existente antes de pasarlo a su Servlet.

14

Si el registro es todo lo que buscas, sugiero que escribas una implementación de javax.servlet.Filter que envuelve el HttpServletResponse suministrado en un contenedor que te permite exponer las cookies después de que se haya ejecutado el filtro. Algo como esto:

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 advertencia importante: esto no a mostrar lo que las cookies se envían de vuelta al navegador, sólo se le mostrará qué cookies del código de la aplicación de agregar a la respuesta. Si el contenedor elige cambiar, agregar o ignorar esas cookies (por ejemplo, las cookies de sesión son manejadas por el contenedor, no por la aplicación), no sabrá usar este enfoque. Pero eso puede no importar para su situación.

La única manera de estar seguro es utilizar un complemento de navegador como Live Http Headers for Firefox, o un proxy de registro de HTTP man-in-the-middle.

+0

Tal vez me falta algo ... ¿Por qué ¿no puedes ampliar el registro estándar de tu contenedor (por ejemplo, 'AccessLogValve' de Tomcat) y filtrar los encabezados de respuesta buscando 'Set-Cookie's para iniciar sesión? Eso debería permitirle registrar las cookies definitivas establecidas en el navegador. –

8

que tenían el mismo problema en el que yo estaba usando una biblioteca de 3 ª parte que acepta un HttpServletResponse y necesitaba volver a leer las cookies que se había fijado en mi objeto de respuesta. Para resolver ese creé una extensión HttpServletResponseWrapper que expone estas galletas para mí después de hacer la llamada:

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); 
    } 

} 

Y la forma en que 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(); 
Cuestiones relacionadas