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

san*_*oid 19 java cookies servlets response

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

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

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

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

谢谢,一如既往.

ska*_*man 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
}
Run Code Online (Sandbox Code Playgroud)

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

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


aco*_*hen 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);
    }

} 
Run Code Online (Sandbox Code Playgroud)

我使用它的方式:

// 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();
Run Code Online (Sandbox Code Playgroud)


Dea*_*vey 5

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