似乎HttpServletResponse没有公开任何方法来执行此操作。
现在,我正在向一个狡猾且不易理解的servlet添加一堆日志代码,试图找出它究竟是做什么的。我知道它设置了一堆cookie,但我不知道何时,为什么或什么。在servlet执行结束时只记录HttpServletResponse对象中的所有cookie会很好。
我知道cookie通常是浏览器的责任,我记得在.NET中无法做到这一点。只是希望Java可能不同......
但是,如果这是不可能的 - 关于如何完成我正在尝试做的任何其他想法?
一如既往地谢谢。
答案 0 :(得分:16)
如果您正在完成日志记录,那么我建议编写javax.servlet.Filter
的实现,它将提供的HttpServletResponse
包装在一个包装器中,允许您在过滤器执行后公开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<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
}
一个很大的警告:这将不显示哪些cookie被发送回浏览器,它只会显示应用程序代码添加到响应中的cookie。如果容器选择更改,添加或忽略这些cookie(例如,会话cookie由容器而不是应用程序处理),您将不会知道使用此方法。但这对你的情况可能无关紧要。
唯一可以确定的方法是使用像Live Http Headers for Firefox这样的浏览器插件,或者使用中间人的HTTP日志记录代理。
答案 1 :(得分:10)
我遇到了同样的问题,我使用的第三方库接受了HttpServletResponse,我需要回读它在我的响应对象上设置的cookie。为了解决这个问题,我创建了一个HttpServletResponseWrapper扩展,在我拨打电话后为我公开这些cookie:
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);
}
}
我使用它的方式:
// 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();
答案 2 :(得分:5)
您唯一的方法是包装HttpServletResponse对象,以便addCookie方法可以在设置cookie时拦截和记录。您可以通过添加一个ServletFilter来实现这一点,该ServletFilter在将现有的HttpServletResponse传递到您的Servlet之前将其包装起来。
答案 3 :(得分:0)
在“ Set-Cookie”响应头中将Cookie发送到客户端。试试这个:
private static void logResponseHeaders(HttpServletResponse httpServletResponse) {
Collection<String> headerNames = httpServletResponse.getHeaderNames();
for (String headerName : headerNames) {
if (headerName.equals("Set-Cookie")) {
log.info("Response header name={}, header value={}", headerName, httpServletResponse.getHeader(headerName));
}
}
}