Сервлеты: setAttribute в HttpServletRequest vs setAttribute в HttpSession

В чем разница между методом setAttribute() класса HttpServletRequest и setAttribute() класса HttpSession?

При каких обстоятельствах они используются?

Ответ 1

Атрибут задает атрибут в области запроса, а другой устанавливает атрибут в области сеанса. Основное различие заключается в сроке службы. Область запроса заканчивается, когда соответствующий ответ завершен. Сфера действия сеанса заканчивается, когда сеанс был отключен клиентом или сервером. Когда область действия заканчивается, все ее атрибуты будут разбиты, и они не будут доступны в другом запросе или сеансе.

Вы используете область запроса для хранения данных, которые должны быть конкретными для HTTP-запроса (например, результаты базы данных на основе конкретного запроса, сообщения об успешности/ошибках и т.д.). Вы используете область сеанса для хранения данных, которые должны быть специфичными для сеанса HTTP (например, пользователь в системе, пользовательские настройки и т.д.). Все запросы одного и того же клиента используют один и тот же сеанс (таким образом, все разные вкладки/окна браузера в одном сеансе клиента будут совместно использовать один и тот же сеанс сервера).

См. также:

Ответ 2

если вы используете httpServletRequest.setAttribute(); то атрибут будет привязан к этому объекту запроса,

а в httpServletSession.setAttribute(); будет привязано attr. в сеансе.

поэтому, если вы хотите, чтобы область данных этих данных использовалась в сеансе session, или если вам нужна область этих данных только для запроса, используйте request

Пример:

Имя пользователя вошедшего в систему пользователя должно быть общим для сеанса, поэтому сохраните его в session

while, сообщение об ошибке, которое вы даете пользователю, при рассмотрении дела об ошибке аутентификации, его необходимо для этого запроса, только после этого нам не нужно, так что держите его в request

Ответ 3

Когда вы устанавливаете атрибут объекта Request, переменная доступна только в области запроса. К этой переменной можно обращаться другие jsp/resources, которые вы отправляете в рамках этого запроса.

При установке атрибута в области сеанса будет доступно все запросы в сеансе пользователя (если вы не удалите его из сеанса).

Таким образом, основное различие, которое он сжимает, - это область действия/срок действия атрибута.

Всегда пытайтесь использовать переменные области запроса, если вам не нужно использовать его во время сеанса пользователя ex: как роли пользователя. Сохранение большего количества данных в сеансе с более параллельными пользователями может привести к проблемам с памятью. Также, если вы используете общий доступ к сеансу, поддерживаемый базой данных (например, вы можете делать в websphere), это приведет к проблемам с производительностью.