我正在尝试编写一个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过滤器的afterView
和after = {
// returns 0
request.getAttribute('counter').byteCount
}
afterView = {
// returns the correct response size
request.getAttribute('counter').byteCount
}
闭包中
{{1}}
它现在返回正确的响应大小,但似乎sitemesh布局生成的内容已消失,只留下GSP本身的内容。
所以我似乎接近一个解决方案。我的猜测是我在错误的时间刷新缓冲区,和/或我的过滤器没有在过滤器链中的正确位置运行。
事实证明这比我预期的要困难得多。有更简单的方法吗?
答案 0 :(得分:4)
Grails内置了此功能。它没有文档。通过向JVM args添加“-DGSPResponseWriter.enableContentLength = true”选项,将系统属性“GSPResponseWriter.enableContentLength”设置为true。有关详细信息,请参阅source code of GSPResponseWriter。
默认情况下未启用此选项的原因是计算内容长度并不简单,因为某些字符是UTF-8编码的多字节。 BoundedCharsAsEncodedBytesCounter是进行计算的类。