«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.