有没有办法从Java中的响应对象中读取cookie?

似乎HttpServletResponse没有公开任何方法来执行此操作。

现在,我正在为一个狡猾且不易理解的servlet添加一堆日志代码,试图找出它究竟是做什么的。 我知道它设置了一堆cookies,但我不知道何时,为什么或什么。 在servlet执行结束时只记录HttpServletResponse对象中的所有cookie会很好。

我知道cookie通常是浏览器的责任,我记得在.NET中无法做到这一点。 只是希望Java可能会有所不同……

但如果这是不可能的 – 任何其他想法如何完成我正在尝试做的事情?

谢谢,一如既往。

如果你正在完成日志记录,那么我建议编写一个javax.servlet.Filter实现,它将提供的HttpServletResponse包装在一个包装器中,允许你在filter执行后公开cookie。 像这样的东西:

 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 cookies = new ArrayList(); public ResponseWrapper(HttpServletResponse response) { super(response); } @Override public void addCookie(Cookie cookie) { super.addCookie(cookie); cookies.add(cookie); } } // other methods here } 

一个很大的警告:这不会向您显示将哪些cookie发送回浏览器,它只会向您显示应用程序代码添加到响应中的cookie。 如果容器选择更改,添加或忽略这些cookie(例如,会话cookie由容器而不是应用程序处理),您将不会知道使用此方法。 但这对你的情况可能无关紧要。

唯一可以肯定的方法是使用像Live Http Headers for Firefox这样的浏览器插件,或者是一个中间人的HTTP日志代理。

我遇到了同样的问题,我使用的第三方库接受了HttpServletResponse,我需要读回它在我的响应对象上设置的cookie。 为了解决这个问题,我创建了一个HttpServletResponseWrapper扩展,在我拨打电话后为我公开这些cookie:

 public class CookieAwareHttpServletResponse extends HttpServletResponseWrapper { private List cookies = new ArrayList(); public CookieAwareHttpServletResponse (HttpServletResponse aResponse) { super (aResponse); } @Override public void addCookie (Cookie aCookie) { cookies.add (aCookie); super.addCookie(aCookie); } public List getCookies () { return Collections.unmodifiableList (cookies); } } 

我使用它的方式:

 // 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 cookies = response.getCookies(); 

您唯一的方法是包装HttpServletResponse对象,以便addCookie方法可以在设置cookie时拦截和记录。 您可以通过添加ServletFilter来实现此目的,该ServletFilter在将现有HttpServletResponse传递到您的Servlet之前将其包装起来。