Я прочитал, что isNew () возвращает true, если клиент еще не ответил с идентификатором сеанса. Но что это значит?
Учтите, что сервер в настоящее время обрабатывает запрос. Существует два сценария обработки сеанса.
В новом сценарии сеанса сервер создает новый сеанс для пользователя / клиента. (Клиент, возможно, не указал идентификатор сеанса в запросе, или он мог предоставить идентификатор сеанса, который сервер считает недействительным.) Код приложения сервлета решает, что сеанс необходим (например, потому что он имеет некоторую информацию, которую он хочет хранить там), и пытается извлечь его с флагом «создать, если не присутствует». Инфраструктура сервлета понимает, что текущий сеанс отсутствует, создает новый с новым идентификатором сеанса и сохраняет его в хранилище сеансов. По завершении запроса идентификатор сеанса возвращается клиенту; например в виде файла cookie или URL-адреса с прикрепленным идентификатором сеанса.
В существующем сценарии сеанса клиент включил в запрос идентификатор сеанса; например в качестве файла cookie сеанса или в качестве идентификатора сеанса в URL-адресе запроса. Инфраструктура сервлета распознает этот идентификатор, ищет его в своем хранилище сеансов и (при необходимости) воссоздает объект HttpSession
, содержащий состояние сеанса, полученное из хранилища сеансов. Когда код приложения сервлета пытается получить доступ к сеансу, он получает этот объект HttpSession
, а не новый. Затем состояние сеанса может использоваться и обновляться сервлетом при обработке запроса.
В первом сценарии вызов isNew()
для объекта сеанса вернет true
, потому что это новый сеанс.
Во втором сценарии вызов isNew()
для объекта сеанса вернет false
, потому что это НЕ новый сеанс.
Как вызов isNew () для объекта сеанса, проверка, является ли сеанс новым или уже используется?
Инфраструктура сервлета знает, какой из двух сценариев произошел, потому что она выполняла создание сеанса или поиск сеанса. Наиболее очевидная реализация isNew()
состоит в том, чтобы включить поле private boolean
в объект HttpSession
и вернуть значение этого поля в результате isNew()
. Поле будет инициализировано инфраструктурой сервлета в соответствии с тем, как оно получило объект сеанса.