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

在Java中有没有办法从响应对象读取cookie?,java,cookies,response,servlets,Java,Cookies,Response,Servlets,HttpServletResponse似乎没有公开任何实现这一点的方法 现在,我正在向一个粗糙且不易理解的servlet添加一堆日志代码,试图弄清楚它到底做了什么。我知道它会放一堆饼干,但我不知道什么时候,为什么,或者什么。在servlet执行结束时,将所有cookie记录在HttpServletResponse对象中会更好 我知道Cookie通常是浏览器的责任,我记得在.NET中没有办法做到这一点。只是希望Java可能与众不同 但如果这是不可能的——关于如何完成我想做的事情,还有其他想法吗 谢

HttpServletResponse似乎没有公开任何实现这一点的方法

现在,我正在向一个粗糙且不易理解的servlet添加一堆日志代码,试图弄清楚它到底做了什么。我知道它会放一堆饼干,但我不知道什么时候,为什么,或者什么。在servlet执行结束时,将所有cookie记录在HttpServletResponse对象中会更好

我知道Cookie通常是浏览器的责任,我记得在.NET中没有办法做到这一点。只是希望Java可能与众不同

但如果这是不可能的——关于如何完成我想做的事情,还有其他想法吗


谢谢,一如既往。

您唯一的方法是包装HttpServletResponse对象,以便addCookie方法可以在设置Cookie时拦截和记录。您可以通过添加一个ServletFilter来实现这一点,该过滤器在将现有的HttpServletResponse传递到您的Servlet之前对其进行包装。

如果您只需要进行日志记录,然后我建议编写一个
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
}
公共类CookieLoggingFilter实现过滤器{
public void doFilter(ServletRequest请求、ServletResponse响应、FilterChain FilterChain)抛出IOException、ServletException{
ResponseWrappedResponse=新的ResponseWrapper((HttpServletResponse)响应);
filterChain.doFilter(请求、包装响应);
//在这里使用真正的记录器,当然:)
System.out.println(“Cookies:+wrappedResponse.Cookies”);
}
私有类ResponseWrapper扩展了HttpServletResponseWrapper{
私有集合cookies=new ArrayList();
公共响应包装器(HttpServletResponse){
超级(响应);
}
@凌驾
公共void addCookie(Cookie Cookie){
super.addCookie(cookie);
添加(cookie);
}
}
//这里还有其他方法
}
一个大警告:这不会显示哪些cookie被发送回浏览器,它只会显示应用程序代码添加到响应中的cookie。如果容器选择更改、添加或忽略这些cookie(例如,会话cookie由容器而不是应用程序处理),您将不知道如何使用这种方法。但这对你的处境可能并不重要


唯一可以确保的方法是使用浏览器插件,如,或中间人HTTP日志代理。

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

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

} 
公共类CookieAwareHttpServletResponse扩展了HttpServletResponseWrapper{
私有列表cookies=new ArrayList();
公共CookieAwareHttpServletResponse(HttpServletResponse){
超级(aResponse);
}
@凌驾
公共void addCookie(Cookie aCookie){
cookies.add(aCookie);
super.addCookie(aCookie);
}
公共列表getCookies(){
返回集合。不可修改列表(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();
//包装响应对象
CookieAwareHttpServletResponse=新CookieAwareHttpServletResponse(aResponse);
//致电第三方图书馆
String order=orderService.getOrder(请求、响应、String.class);
//获取设置的cookies列表
List cookies=response.getCookies();

Cookies在“设置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));
        }
    }
}
私有静态void日志响应头(HttpServletResponse HttpServletResponse){
Collection headerNames=httpServletResponse.getHeaderNames();
用于(字符串头名称:头名称){
if(headerName.equals(“设置Cookie”)){
info(“响应头名称={},头值={}”,headerName,httpServletResponse.getHeader(headerName));
}
}
}

也许我遗漏了什么。。。为什么不能扩展容器的标准日志记录(例如Tomcat的
AccessLogValve
)并过滤响应头以查找
将Cookie设置为日志?这样您就可以记录在浏览器中设置的最终cookie。