Как вы заметили, HttpServletRequest
не имеет метода setParameter. Это является преднамеренным, поскольку класс представляет запрос в том виде, как он поступил от клиента, и изменение параметра не будет отражать это.
Одним из решений является использование класса HttpServletRequestWrapper
, который позволяет обернуть один запрос другим. Вы можете создать подкласс этого класса и переопределить метод getParameter
, чтобы вернуть очищенное значение. Затем вы можете передать этот завернутый запрос на chain.doFilter
вместо исходного запроса.
Это немного уродливо, но это то, что API сервлетов говорит, что вы должны делать. Если вы попытаетесь передать что-либо еще doFilter
, некоторые контейнеры сервлетов будут жаловаться, что вы нарушили спецификацию, и откажутся обрабатывать это.
Более элегантное решение - больше работы - измените исходный сервлет / JSP, который обрабатывает параметр, так, чтобы он ожидал запрос атрибут вместо параметра. Фильтр проверяет параметр, очищает его и устанавливает атрибут (используя request.setAttribute
) с очищенным значением. Нет подклассов, нет спуфинга, но требуется изменить другие части вашего приложения.