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

2022-09-01 23:07:27

HttpServletResponse似乎没有公开任何方法来做到这一点。

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

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

但是,如果这是不可能的 - 关于如何完成我想要做的事情的任何其他想法?

谢谢,一如既往。


答案 1

如果日志记录是你所追求的,那么我建议编写一个实现,它将所提供的包装在一个包装器中,允许你在过滤器执行后公开cookie。像这样:javax.servlet.FilterHttpServletResponse

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 由容器而不是应用程序处理),则您不会知道使用此方法。但这对你的情况可能并不重要。

唯一确定的方法是使用浏览器插件,如Firefox的Live Http Headers,或中间人HTTP日志记录代理。


答案 2

我遇到了同样的问题,我使用接受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();

推荐