我正在尝试编写一个 Grails 插件,该插件记录安装它的应用程序发送的每个 HTTP 响应的大小。到目前为止我尝试过的方法是:
(1) 编写一个 servlet 过滤器,将response
. 响应包装器用计算响应中字节数的OutputStream
an来装饰。OutputStream
这些类显示在这里。
(2)在插件描述符中注册servlet过滤器
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'('/*')
}
}
}
(3) 在 Grails 过滤器中,尝试检索写入的字节数,如下所示:
afterView = {
// countingFilter registers the response wrapper as an attribute of the request
// named 'counter'
request.getAttribute('counter').byteCount
}
但总是返回 0 值。但是,我发现如果我将上面的代码添加到 Grails 过滤器的after
和afterView
闭包中
after = {
// returns 0
request.getAttribute('counter').byteCount
}
afterView = {
// returns the correct response size
request.getAttribute('counter').byteCount
}
它现在返回正确的响应大小,但似乎站点网格布局生成的内容已经消失,只剩下 GSP 本身中的内容。
所以看来我接近解决方案了。我的猜测是我在错误的时间刷新缓冲区,和/或我的过滤器没有在过滤器链中的正确点运行。
事实证明,这比我预期的要困难得多。有没有更简单的方法?