Передача объекта из Spring HandlerInterceptor в фильтр сервлетов

1

Существует webapp, где каждый запрос потребляет различные внешние ресурсы. Webapp отслеживает потребляемые ресурсы с помощью обработанного запроса компонента. Затем метод HandlerInterceptor afterCompletion вызывает TaskExecutor для хранения этой информации в БД. Все в порядке и денди, но есть требование добавить потребление полосы пропускания в качестве другого ресурса. Подсчет исходящего размера ответа является типичной задачей для фильтра сервлетов (вместе с оболочкой ответа и реализацией пользовательского потока). Так что это делается и также работает.

Проблема в том, что я хотел бы объединить две вещи вместе. Очевидно, что я не могу передать "байты, отправленные" в Spring HandlerInterceptor, потому что фильтр doFilter() еще не завершен, и количество отправленных байтов неизвестно, когда запущен перехватчик. Поэтому фильтр должен быть местом для агрегирования всех ресурсов и запускать асинхронную задачу для хранения в БД. Проблема заключается в следующем: как передать данные из HandlerInterceptor в Filter. Я пробовал простой request.setAttribute(), но на удивление это не сработало.

В качестве побочного примечания: я знаю о запросе, который был использован для обработки жизненного цикла компонента, а у обработчика я создаю простой POJO, заполненный данными из обработанного bean-компонента.

  • 0
    Вы пытались добавить следы журнала в обоих местах, чтобы увидеть, что именно они видят в запросах?
  • 0
    @SergeBallesta Да, и эта проверка могла просто открыть ключ. Запросы одинаковы в смысле контента (URL и атрибуты). Тем не менее, Filter видит ваш простой HttpServletRequest, в то время как обработчику передается SavedRequestAwareWrapper Spring Security. Это не должно быть чем-то особенным, но, похоже, эта обертка вызывает некоторые странные вещи, так что в конце концов это может быть правильным.
Показать ещё 2 комментария
Теги:
spring
spring-mvc
servlet-filters

1 ответ

1
Лучший ответ

Проблема оказалась довольно треугольной. Приложение выполняло множество переадресаций/отправлений в рамках частичной обработки запросов. Оказалось, что мой фильтр был вызван (до сих пор, так хорош), тогда другой фильтр вниз по цепочке выполнял переадресацию/отправку, которая затем выполняла фактическую обработку запроса. Настройка фильтра по умолчанию захватывает только простые запросы, и вам нужна дополнительная настройка (web.xml), чтобы также фильтровать форварды/отправки. Я просто сделал это, и это решило проблему.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню