Должны ли фильтры писать в ответ во время или после фильтрации? - PullRequest
1 голос
/ 21 апреля 2010

У меня есть фильтр, который обрабатывает сгенерированный HTML и перезаписывает определенные элементы.Например, он добавляет атрибуты класса к некоторым якорям.Наконец, он записывает обработанный HTML-код в ответ (подкласс HttpServletResponseWrapper).Естественно, это означает, что обработанный HTML-код имеет другую длину после того, как он прошел через фильтр.

Я вижу два подхода к этому.

Одним из них является итерация по HTML с использованием StringBuilder для создания обработанного HTML и запись обработанного HTML в ответ после завершения всей фильтрации.Другой - перебирать HTML, но записывать его в ответ, как только каждый элемент обработан.

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

Ответы [ 2 ]

1 голос
/ 21 апреля 2010

Сложность потоковой передачи ответа (т.е. записи его «на ходу») заключается в структуре кода: ваша обработка должна быть такой, чтобы байты ответа были получены в должном порядке.Но если вы собрали ответ в StringBuilder, тогда ваш код уже подходит для потоковой передачи.Просто замените StringBuilder на PrintWriter, который возвращает метод ServletResponse.getWriter().

Обратите внимание, что в HTTP 1.0 HTTP-сервер должен либо предоставить длину содержимого в заголовках ответа, либо закрыть соединение вконец ответа.HTTP 1.1 включает в себя «кодирование передачи по частям», которое позволяет осуществлять потоковую передачу данных, не зная заранее длины контента, и не предотвращая повторное использование соединения для последующих HTTP-запросов.Это должно выполняться автоматически, поэтому вам не нужно об этом беспокоиться, если вы не пытаетесь поддерживать действительно старых клиентов HTTP.

0 голосов
/ 21 апреля 2010

Очевидно, что второму подходу потребуется меньше памяти и увеличится скорость отклика, но его часто сложнее реализовать.

...