从Grails插件获取HTTP响应大小

时间:2013-03-21 13:31:22

标签: grails servlet-filters

我正在尝试编写一个Grails插件,用于记录其安装的应用程序发送的每个HTTP响应的大小。到目前为止我尝试过的方法是:

(1)编写一个包装response的servlet过滤器。响应包装器使用OutputStream来装饰OutputStream,该def doWithWebDescriptor = { webXml -> def contextParam = webXml.'context-param' contextParam[contextParam.size() - 1] + { 'filter' { 'filter-name'('countingFilter') 'filter-class'(CountingFilter.name) } } def filter = webXml.'filter' filter[filter.size() - 1] + { 'filter-mapping' { 'filter-name'('countingFilter') 'url-pattern'('/*') } } } 计算响应中的字节数。这些类显示为here

(2)在插件描述符

中注册servlet过滤器
afterView = {
    // countingFilter registers the response wrapper as an attribute of the request
    // named 'counter'
    request.getAttribute('counter').byteCount
}

(3)在Grails过滤器中,尝试检索如下所写的字节数:

after

但始终返回值0。但是,我发现如果我将上面的代码添加到Grails过滤器的afterViewafter = { // returns 0 request.getAttribute('counter').byteCount } afterView = { // returns the correct response size request.getAttribute('counter').byteCount } 闭包中

{{1}}

它现在返回正确的响应大小,但似乎sitemesh布局生成的内容已消失,只留下GSP本身的内容。

所以我似乎接近一个解决方案。我的猜测是我在错误的时间刷新缓冲区,和/或我的过滤器没有在过滤器链中的正确位置运行。

事实证明这比我预期的要困难得多。有更简单的方法吗?

1 个答案:

答案 0 :(得分:4)

Grails内置了此功能。它没有文档。通过向JVM args添加“-DGSPResponseWriter.enableContentLength = true”选项,将系统属性“GSPResponseWriter.enableContentLength”设置为true。有关详细信息,请参阅source code of GSPResponseWriter

默认情况下未启用此选项的原因是计算内容长度并不简单,因为某些字符是UTF-8编码的多字节。 BoundedCharsAsEncodedBytesCounter是进行计算的类。