2014-09-25 4 views

ответ

5

Срок службы объекта HttpServletRequest таков: время обслуживания HTTP-запроса сервлета.

Может быть создан непосредственно перед вызовом методов сервлетов doGet(), doPost() и т. Д. И может быть уничтожен сразу после этого. Он действителен только для использования при подаче запроса.

Примечание: Однако Servlet контейнеров может повторного использование HttpServletRequest объектов для нескольких запросов (а это обычно имеет место), но они будут «очистить» или сброс так что никаких объектов (например, параметры или атрибуты) будет протекать между Запросы. Это просто из-за проблемы с производительностью: гораздо быстрее и дешевле сбросить объект HttpServletRequest, чем выбросить существующий и создать новый.

В типичной реализации контейнера сервлета при входе HTTP-запроса создается HttpServletRequest, когда входные данные HTTP запроса обрабатываются контейнером Servlet. Весь запрос может быть лениво инициализирован (например, параметры могут обрабатываться только и обрабатываться, если они действительно доступны, например, с помощью метода getParameter()). Тогда это HttpServletRequest (который проходит ServletRequest) пропускают через сервлет фильтры, а затем передается на Servlet.service(), который направит вызов doGet(), doPost() и т.д., основанный на методе HTTP (GET, POST, PUT и т.д.). Затем запрос будет оставаться в живых до тех пор, пока пара запроса-ответа не будет циклически возвращаться по всей цепочке фильтров. И тогда он будет уничтожен или сброшен (прежде чем он будет использоваться для другого HTTP-запроса).

+0

Если кто-то передает объект HttpServletRequest в другое место, объект HttpServletRequest останется за циклом запроса. Как вы думаете? –

+2

Да, вы можете это сделать, но использование объекта запроса вне цикла запроса недействительно. Поэтому настоятельно не рекомендуется. – icza

+1

@icza вы не представляете, насколько вы только что мне помогли прямо сейчас - у нас была проблема довольно долго, когда «HttpServletRequest» был передан через «@ Async» весны, и в какой-то момент это поля, которые очищаются. Ваш вход - «Однако контейнеры сервлетов могут повторно использовать объекты HttpServletRequest для нескольких запросов (и это обычно имеет место), но они будут« очищены »или сброшены, поэтому никакие объекты (такие как параметры или атрибуты) не будут протекать между запросами« абсолютно ** пятно сверху! **. Спасибо! – Eugene

Смежные вопросы