【问题标题】:Capturing Entire response including headers with HttpServletResponseWrapper使用 HttpServletResponseWrapper 捕获整个响应,包括标头
【发布时间】:2010-11-16 02:34:06
【问题描述】:

提前感谢大家-

所以我继续执行以下代码: How can I read an HttpServletReponses output stream?

这给了我响应的主体(html 等),但我根本没有得到任何标题 - 这可能与 HttpServletResponseWrapper 有关吗?我需要捕获整个请求以进行标头修改等。

谢谢,

山姆

【问题讨论】:

    标签: java jsp tomcat


    【解决方案1】:

    如果要捕获标头,最好的方法是覆盖 HttpServletResponseWrapper 中的所有 addHeader() / setHeader()(日期、int 和字符串),并将它们存储在 HashMap 或 Properties 实例中(或 MultiMap,如果你是使用 Google 收藏)。
    然后,您可以在处理响应后在过滤器中对它们做任何您想做的事情。您还需要在包装器中以某种方式公开它们(例如编写 getHeaders() 方法),因为常规 HttpServletResponse 不会。

    【讨论】:

    • 感谢您的回复-我继续并覆盖了所有标题修改方法-并使用包含“response.addHeader("myheader","headervalue");"的简单jsp对其进行了测试并且该标头被捕获,但似乎没有通过这些方法设置以下标头: Status=OK - 200 Server=Apache-Coyote/1.1 Content-Type=text/html Content-Length=0 Date=Sun, 02格林威治标准时间 2009 年 8 月 02:05:36 看起来 tomcat 正在将这些设置在其他地方,我错过了什么吗?再次感谢您的帮助!
    • 这些是由您的服务器和/或 servlet 容器设置的。您应该能够覆盖它们(这意味着如果您将内容类型设置为其他内容,服务器将保持这种方式),但您不会在包装器中捕获它们,因为它们已添加在您 filterChain (和您的过滤器)已经处理之后。
    • 我测试了它,看起来标题没有被覆盖或替换,请查看以下示例:Status=OK - 200 Server=Apache-Coyote/1.1 Status=500 Content-Type= text/html Content-Length=0 Date=Sun, 2009 年 8 月 2 日 02:40:30 GMT 状态 500 是我在调用 doFilter() 后设置的,但正如您所见,它没有替换 status=200 标头tomcat 正在设置(我认为) - 有什么想法吗?再次感谢您的帮助
    • 您选择了错误的标题进行测试 :-) 抱歉,我之前没有提到过 - 您在问题中说过“标题”,我认为您不会改变状态。状态是设置的第一件事——通过 setStatus() 或 sendError(),所以如果你想改变它,你也需要重写这些方法。请记住,这些方法在处理提交的响应时具有非常具体的行为:java.sun.com/javaee/5/docs/api/javax/servlet/http/… 然后还有 sendRedirect() 和 setContentType(),尽管后者应该可以通过普通标头覆盖
    • 再次感谢您的帮助 - 非常有帮助!
    【解决方案2】:

    一个简单的解决方案是使用 Tomcat 的Request Dumper Valve。这会转储所有元信息,包括每个传入 HttpServletRequest 和传出 HttpServletReply 的标头字段。

    【讨论】:

    • 感谢您的回复 - 我实际上需要这个来允许在前往客户端的途中修改标头 - 不过还是谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    相关资源
    最近更新 更多