Браузеры могут отправлять данные формы только через HTTP-метод GET или HTTP-метод POST, но небраузерные клиенты могут также использовать HTTP-методы PUT, PATCH и DELETE. Servlet API требует, чтобы методы ServletRequest.getParameter*() поддерживали доступ к полям формы только для HTTP-метода POST.

Модуль spring-web предоставляет FormContentFilter для перехвата запросов HTTP-методов PUT, PATCH и DELETE с типом содержимого application/x-www-form-urlencoded, чтения данных формы из тела запроса и обертывания ServletRequest, чтобы обеспечить доступ к этим данным формы через семейство методов ServletRequest.getParameter*().

Переданные заголовки

Пока запрос проходит через прокси-серверы (например, распределитель нагрузки), хост, порт и схема могут меняться, и это усложняет создание ссылок, указывающих на правильный хост, порт и схему с точки зрения клиента.

Спецификация RFC 7239 определяет Forwarded HTTP-заголовок, который прокси-серверы могут использовать для предоставления информации об исходном запросе. Существуют и другие нестандартные заголовки, включая X-Forwarded-Host, X-Forwarded-Port, X-Forwarded-Proto, X-Forwarded-Ssl и X-Forwarded-Prefix.

ForwardedHeaderFilter – это фильтр сервлетов, который модифицирует запрос, чтобы а) изменить хост, порт и схему на основе заголовков Forwarded, и б) удалить эти заголовки, чтобы исключить дальнейшее их влияние. Фильтр действует с учетом обертывания запроса, и поэтому его нужно упорядочить перед другими фильтрами, такими как RequestContextFilter, которые должны работать с измененным, а не оригинальным запросом.

Существуют меры предосторожности для передаваемых заголовков, поскольку приложение не может знать, были ли заголовки добавлены прокси-сервером, как предполагалось, или вредоносным клиентом. Вот почему прокси-сервер на границе доверия нужно сконфигурировать на удаление ненадёжных Forwarded заголовков, приходящих извне. Также можно сконфигурировать ForwardedHeaderFilter с параметром removeOnly=true, и в этом случае он будет удалять, но не использовать заголовки.

Для обеспечения поддержки асинхронных запросов и диспетчеризации ошибок этот фильтр должен быть сопоставлен с DispatcherType.ASYNC, а также DispatcherType.ERROR. При использовании AbstractAnnotationConfigDispatcherServletInitializer из Spring Framework все фильтры автоматически регистрируются для любых типов диспетчеризации. Однако при регистрации фильтра через web.xml или в Spring Boot через FilterRegistrationBean обязательно активируйте DispatcherType.ASYNC и DispatcherType.ERROR в дополнение к DispatcherType.REQUEST.

Поверхностный ETag

Фильтр ShallowEtagHeaderFilter создает "поверхностный" ETag путем кэширования содержимого, записанного в ответ, и вычисления MD5-хэша из него. При следующей отправке клиентом фильтр делает то же самое, но при этом сравнивает вычисленное значение с заголовком запроса If-None-Match и, если они равны, возвращает 304 (NOT_MODIFIED).

Эта стратегия экономит пропускную способность сети, но не ресурсы процессора, так как для каждого запроса необходимо вычислить полный ответ. Другие стратегии на уровне контроллера, описанные ранее, позволяют избежать вычислений.

Этот фильтр имеет параметр writeWeakETag, который настраивает фильтр на запись нестрогих ETag, аналогичных следующим: W/"02a2d595e6ed9a0b24f027f2b63b134d6" (как определено в RFC 7232, раздел 2.3).

Для поддержки асинхронных запросов этот фильтр должен быть отображен на DispatcherType.ASYNC, чтобы фильтр мог отложить обработку и успешно сгенерировать ETag до конца последней асинхронной диспетчеризации. При использованииAbstractAnnotationConfigDispatcherServletInitializerиз Spring Framework все фильтры автоматически регистрируются для всех типов диспетчеризации. Однако если вы регистрируете фильтр через web.xml или в Spring Boot через FilterRegistrationBean, обязательно включите в состав DispatcherType.ASYNC.

CORS

Spring MVC обеспечивает тонкую поддержку конфигурации CORS с помощью аннотаций для контроллеров. Однако при использовании со Spring Security советуем полагаться на встроенный CorsFilter, который должен быть расположен впереди цепочки фильтров Spring Security.

Более подробную информацию см. в разделах, посвященных CORS и CORS-фильтру.