Перейти к основному содержимому

Разница между request.getSession() и request.getSession(true)

· 2 мин. чтения

1. Обзор

В этом кратком руководстве мы увидим разницу между вызовами HttpServletRequest# getSession() и HttpServletRequest# getSession(boolean) .

2. В чем разница?

Методы getSession() и getSession(boolean) очень похожи. Хотя есть небольшая разница. Разница заключается в том, следует ли создавать сеанс, если он еще не существует.

Вызовы getSession() и getSession(true) функционально одинаковы : получить текущий сеанс и, если он еще не существует, создать его.

Однако вызов getSession(false) извлекает текущий сеанс и, если он еще не существует, возвращает null . Среди прочего, это удобно, когда мы хотим узнать, существует ли сессия.

3. Пример

В этом примере мы рассматриваем такой сценарий:

  • пользователь вводит идентификатор пользователя и входит в приложение
  • затем пользователь вводит имя пользователя и возраст и хочет обновить эти данные для вошедшего в систему пользователя

Мы сохраним пользовательские значения в сеансе, чтобы понять использование HttpServletRequest#getSession() и HttpServletRequest#getSession(boolean).

Во-первых, давайте создадим сервлет, в котором мы используем HttpServletRequest#getSession() в его методе doGet() :

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
session.setAttribute("userId", request.getParameter("userId"));
}

В этот момент сервлет извлечет существующий сеанс или создаст новый для вошедшего в систему пользователя, если он не существует.

Далее мы установим атрибут userName в сеансе.

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

Итак, теперь мы будем использовать HttpServletRequest#getSession(boolean) со значением false :

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession(false);
if (session != null) {
session.setAttribute("userName", request.getParameter("userName"));
}
}

Это приведет к установке атрибута userName в том же сеансе, в котором ранее был установлен userId .

4. Вывод

В этом руководстве мы объяснили разницу между методами HttpServletRequest#getSession() и HttpServletRequest#getSession(boolean) .

Полный пример доступен на GitHub .