Я пытаюсь написать плагин Grails, который записывает размер каждого ответа HTTP, посланного приложением он установлен в подходе я пытался до сих пор:Get HTTP размер Ответ Grails плагин
(1) Напишите фильтр сервлета, который обертывает response
. Обертка ответа украшает OutputStream
OutputStream
, который подсчитывает количество байтов в ответе. Эти классы показаны here.
(2) Регистрация фильтр сервлетов в дескрипторе плагина
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. Тем не менее, я обнаружил, что если добавить код выше обоих after
и afterView
замыканий Grails фильтр
after = {
// returns 0
request.getAttribute('counter').byteCount
}
afterView = {
// returns the correct response size
request.getAttribute('counter').byteCount
}
Он теперь возвращает правильный размер ответа, но, кажется, содержание, порожденное SiteMesh макет исчез, оставляя только контент в самом GSP.
Так что кажется, что я близок к решению. Я предполагаю, что я очищаю буферы в неподходящее время и/или мой фильтр не работает в правильной точке в цепочке фильтров.
Это оказалось намного сложнее, чем я ожидал. Есть ли более простой способ?
http://jira.grails.org/browse/GRAILS-7007 - аналогичный вопрос. Посмотрите на это для деталей. –