Мне нужно создать контрольный отчет о том, есть ли в общей схеме: минимизация + динамические HTML-ответы GZIP (сгенерированные с помощью GSP) для каждого запроса, что приведет к дополнительным накладным расходам из-за анализа сгенерированной динамической строки HTML, а затем сжатия с использованием библиотека Java (что приводит к меньшему размеру ответа) на самом деле лучше, чем GZIP без минимизации (что приводит к более быстрому времени отклика, но немного большему размеру ответа). У меня сложилось впечатление, что это "улучшение" может быть незначительно, но мне нужен отчет о тестировании, чтобы подтвердить его для команды.
Для этого я изменяю действия контроллера следующим образом:
// import ...MinifyPlugin
class HomeController {
def get() {
Map model = [:]
String htmlBody = groovyPageRenderer.render(view: "/get", model: model)
// This adds a few milliseconds and reduce few characters.
htmlBody = MinifyPlugin.minifyHtmlString(htmlBody)
render htmlBody
}
}
Но проект Grails имеет почти сотню действий, и делать это для каждого существующего действия нецелесообразно и неудобно, тем более что после сравнительного анализа мы можем решить не минимизировать ответ HTML. Поэтому я думал сделать это внутри Interceptor
вместо этого:
void afterView() {
if(response.getContentType().contains("text/html")) {
// This throws IllegalStateException: getWriter() has already been called for this response
OutputStream servletOutputStream = response.getOutputStream()
String htmlBody = new String(servletOutputStream.toByteArray())
htmlBody = MinifyingPlugin.minifyHtmlString(htmlBody)
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()
byteArrayOutputStream.write(htmlBody.getBytes())
response.setCharacterEncoding("UTF-8")
response.setContentType("text/html")
response.outputStream << byteArrayOutputStream
}
}
Но кажется, что модификация тела ответа невозможна, как только он попадает в перехватчик afterView
...? Итак, есть ли другой способ сделать это с помощью перехватчиков Grails 3, или мне следует обновить каждое действие контроллера, которое у нас есть, вручную и вместо этого выполнить модификацию?
afterView
вызывается после того, как ответ был написан, так что уже слишком поздно. - person Jeff Scott Brown   schedule 11.06.2020