【问题标题】:Servlet Filters - Problems with manipulating JSP response dataServlet 过滤器 - 处理 JSP 响应数据的问题
【发布时间】:2011-12-05 18:32:50
【问题描述】:

我正在构建一个 Web 应用程序,它应该测量 httprequests/response 时间以及响应大小。对于这个任务,我使用了:http://angelborroy.wordpress.com/2009/03/04/dump-request-and-response-using-javaxservletfilter/ 过滤器,它完成了我需要的一切,只是它转储请求/响应数据而不是打印响应大小。 它适用于 Servlet,但似乎 JSP 存在问题......当我尝试在浏览器中加载 JSP 时,它显示一个空白页面,并且过滤器回显响应大小为 0 .

同样,当请求的页面是 servlet 时,它可以完美运行......知道什么会导致这个问题吗?

更新:我一直在尝试找到任何包含 servlet 响应的过滤器,然后能够将响应转发回客户端(即使是原样!)但没有任何运气,如果有人的话可以指出一个工作示例,包装器的作用并不重要,只是一个简单的包装器,它对响应内容执行某些操作并在更改后将其转发回客户端,我将不胜感激。

附言

我正在使用 Apache Tomcat 7

【问题讨论】:

    标签: java servlets servlet-filters


    【解决方案1】:

    doFilter()之后刷新写入器和流:

    filterChain.doFilter(req, wrappedResp);
    pw.getWriter().flush();
    pw.getStream().flush();
    

    请注意,链接代码在以下情况下不会抛出IllegalStateException

    • 您调用了getWriter(),并且已经为此响应对象调用了getOutputStream 方法。

    查看javamelody的源代码。他们的代码看起来更健壮。


    PrintWriter uses an inner BufferedReader 需要刷新。这只是一个快速的解决方案,所以也许getStream().flush() 并不是真正需要的。请注意我打电话给pw.get*().flush(),而不是response.get*().flush()。但是当没有显示 JSP 时,它仍然只是针对特定问题的快速回答。如果您需要生产级解决方案,请检查 javamelody 的来源。他们可能比参考文章处理更多的极端情况(如提到的IllegalStateException)。 我会从 javamelody 的源代码开始,我会删掉不必要的功能。

    【讨论】:

    • 有效!!!非常感谢,你能用几句话解释一下为什么 flush()ing 会成功吗?
    • 另外,如果你说 getOutputStream() 应该在 getWriter() 被调用时抛出“IllegalStateException”,我不能同时调用“flush”,可以吗?跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 2011-11-30
    • 2015-11-11
    • 2013-04-20
    • 2013-05-03
    • 2014-12-14
    • 1970-01-01
    相关资源
    最近更新 更多