2013-03-21 1 views
4

Я пытаюсь написать плагин Grails, который записывает размер каждого ответа HTTP, посланного приложением он установлен в подходе я пытался до сих пор:Get HTTP размер Ответ Grails плагин

(1) Напишите фильтр сервлета, который обертывает response. Обертка ответа украшает OutputStreamOutputStream, который подсчитывает количество байтов в ответе. Эти классы показаны 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.

Так что кажется, что я близок к решению. Я предполагаю, что я очищаю буферы в неподходящее время и/или мой фильтр не работает в правильной точке в цепочке фильтров.

Это оказалось намного сложнее, чем я ожидал. Есть ли более простой способ?

ответ

4

У Grails эта встроенная функция. Недокументирована. Установите для системного свойства «GSPResponseWriter.enableContentLength» значение true, добавив параметр «-DGSPResponseWriter.enableContentLength = true» в аргументы JVM. Дополнительную информацию см. В разделе source code of GSPResponseWriter.

Причина, по которой это по умолчанию не включена, заключается в том, что вычисление длины содержимого непросто, поскольку некоторые символы являются многобайтовыми в кодировке UTF-8. BoundedCharsAsEncodedBytesCounter - класс, выполняющий расчет.

+1

http://jira.grails.org/browse/GRAILS-7007 - аналогичный вопрос. Посмотрите на это для деталей. –

 Смежные вопросы

  • Нет связанных вопросов^_^