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

Posted

技术标签:

【中文标题】有没有办法从 Java 中的响应对象中读取 cookie?【英文标题】:Is there any way to read cookies from the response object in Java? 【发布时间】:2011-03-31 06:22:21 【问题描述】:

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

现在,我正在将一堆日志记录代码添加到一个笨拙且难以理解的 servlet 中,以试图弄清楚它究竟做了什么。我知道它设置了一堆 cookie,但我不知道何时、为什么或什么。最好在 servlet 执行结束时将所有 cookie 记录在 HttpServletResponse 对象中。

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

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

谢谢,一如既往。

【问题讨论】:

【参考方案1】:

如果您只需要日志记录,那么我建议编写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 日志记录代理。

【讨论】:

也许我遗漏了一些东西...为什么不能扩展容器的标准日志记录(例如 Tomcat 的AccessLogValve)并过滤寻找Set-Cookies 记录的响应标头?这应该让您记录在浏览器中设置的最终 cookie。【参考方案2】:

我在使用接受 HttpServletResponse 的 3rd 方库时遇到了同样的问题,我需要读回它在我的响应对象上设置的 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();

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

Cookie 在“Set-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));
        
    

【讨论】:

以上是关于有没有办法从 Java 中的响应对象中读取 cookie?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法使用 read.csv 从字符串值而不是 R 中的文件读取?

从文件中读取多行中的多个值(Java)

是否可以从 InputStream 创建一个 File 对象

如何从 Python 中的文件/流中懒惰地读取多个 JSON 值?

从文件夹中读取 Java 流中的块中的文件名

有没有办法使用给定目录中的 numpy.genfromtxt 从 csv 读取数据?