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

时间:2010-08-17 22:26:16

标签: java cookies response servlets

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

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

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

但是,如果这是不可能的 - 关于如何完成我正在尝试做的任何其他想法?

一如既往地谢谢。

4 个答案:

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