gpt4 book ai didi

grails - 从 Grails 插件获取 HTTP 响应大小

转载 作者:行者123 更新时间:2023-12-01 01:11:01 24 4
gpt4 key购买 nike

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

(1) 编写一个 servlet 过滤器来包装 response .响应包装器装饰 OutputStreamOutputStream计算响应中的字节数。这些类显示为 here .

(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 值。但是,我发现如果我将上面的代码添加到 afterafterView Grails 过滤器的关闭
after = {
// returns 0
request.getAttribute('counter').byteCount
}

afterView = {
// returns the correct response size
request.getAttribute('counter').byteCount
}

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

所以看来我已经接近解决方案了。我的猜测是我在错误的时间刷新缓冲区,和/或我的过滤器没有在过滤器链中的正确点运行。

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

最佳答案

Grails 内置了此功能。它没有记录。通过向 JVM 参数添加“-DGSPResponseWriter.enableContentLength=true”选项,将系统属性“GSPResponseWriter.enableContentLength”设置为 true。见 source code of GSPResponseWriter更多细节。

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

关于grails - 从 Grails 插件获取 HTTP 响应大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15549006/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com