Существует webapp, где каждый запрос потребляет различные внешние ресурсы. Webapp отслеживает потребляемые ресурсы с помощью обработанного запроса компонента. Затем метод HandlerInterceptor afterCompletion вызывает TaskExecutor для хранения этой информации в БД. Все в порядке и денди, но есть требование добавить потребление полосы пропускания в качестве другого ресурса. Подсчет исходящего размера ответа является типичной задачей для фильтра сервлетов (вместе с оболочкой ответа и реализацией пользовательского потока). Так что это делается и также работает.
Проблема в том, что я хотел бы объединить две вещи вместе. Очевидно, что я не могу передать "байты, отправленные" в Spring HandlerInterceptor, потому что фильтр doFilter() еще не завершен, и количество отправленных байтов неизвестно, когда запущен перехватчик. Поэтому фильтр должен быть местом для агрегирования всех ресурсов и запускать асинхронную задачу для хранения в БД. Проблема заключается в следующем: как передать данные из HandlerInterceptor в Filter. Я пробовал простой request.setAttribute(), но на удивление это не сработало.
В качестве побочного примечания: я знаю о запросе, который был использован для обработки жизненного цикла компонента, а у обработчика я создаю простой POJO, заполненный данными из обработанного bean-компонента.
Проблема оказалась довольно треугольной. Приложение выполняло множество переадресаций/отправлений в рамках частичной обработки запросов. Оказалось, что мой фильтр был вызван (до сих пор, так хорош), тогда другой фильтр вниз по цепочке выполнял переадресацию/отправку, которая затем выполняла фактическую обработку запроса. Настройка фильтра по умолчанию захватывает только простые запросы, и вам нужна дополнительная настройка (web.xml), чтобы также фильтровать форварды/отправки. Я просто сделал это, и это решило проблему.