2010-04-21 1 views
1

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

Я вижу два способа приблизиться к этому.

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

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

+0

Вы уверены, что это то, что вы хотите делать на стороне сервера? разбор html может стать уродливым. –

+0

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

ответ

1

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

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

0

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