Я работаю над устаревшим кодом и должен сделать патч.Изменить тело HttpServletRequest
Проблема: старое приложение отправляет плохие HTTP-запросы POST. Один из параметров не кодируется URL. Я знаю, что этот параметр всегда приходит последним, и я знаю, что это имя. Теперь я пытаюсь исправить это на стороне сервера, которая работает внутри tomcat.
Этот параметр недоступен с помощью стандартного метода getParameter метода HttpServletRequest, поскольку он неверен. Метод просто возвращает null. Но когда я вручную считываю весь запрос с помощью ServletInputStream, все остальные параметры исчезают. Похоже, что базовые классы не могут анализировать содержимое ServletInputStream, поскольку он исчерпан.
До сих пор мне удалось создать оболочку, которая считывает все параметры из тела и переопределяет все методы доступа к параметрам. Но если какой-либо фильтр в цепочке перед моим будет пытаться получить доступ к любому параметру, все будет ломаться, поскольку ServletInputStream будет пустым.
Могу ли я как-то избежать этой проблемы? Может быть, есть другой подход?
Подводя итог, если я прочитаю необработанное тело запроса в фильтре, параметры исчезнут из запроса. Если я прочитаю единственный параметр, ServletInputStream станет пустым, и ручная обработка будет невозможна. Более того, невозможно прочитать неверный параметр с помощью метода getParameter.
Не могли бы вы предоставить более подробную информацию о ручном анализе параметров запроса вручную? Разве это недостаточно, чтобы просто переопределить getInputStream и getReader? –
Хорошо, я посмотрел. Мне приходилось во многом анализировать параметры, потому что один из них был поврежден, как описано в вопросе. Если они в порядке, просьба не требуется. – clorz
См. Здесь для полной реализации: http://stackoverflow.com/a/1048123/535203 –