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