Какая область видимости бина используется для контекста пользователя в веб-приложении Spring?
Что проверяют
Знаете ли вы веб-области видимости бинов и понимаете ли, как короткоживущий бин попадает в синглтон. Следом обычно просят объяснить, зачем нужен scoped proxy, и спрашивают, стали бы вы вообще хранить пользователя в сессионном бине.
Как отвечать
Короткий ответ: session. Бин создаётся один на HTTP-сессию и живёт, пока она не истечёт или не будет инвалидирована. В Spring Boot таймаут задаёт server.servlet.session.timeout, по умолчанию 30 минут.
Покажите весь набор, чтобы было видно место session:
singleton: по умолчанию, один экземпляр на контекст;prototype: новый экземпляр при каждом запросе бина из контейнера;request: один на HTTP-запрос;session: один на HTTP-сессию пользователя;application: один наServletContext;websocket: один на WebSocket-сессию.
Объявляют через @SessionScope или @Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS). Прокси тут ключевой: контроллеры и сервисы это синглтоны, созданные при старте, когда сессии ещё нет. В них внедряется прокси, который на каждом вызове находит экземпляр текущей сессии. Без прокси контекст упадёт на старте с ошибкой, что scope session не активен для текущего потока. У @SessionScope режим TARGET_CLASS уже стоит по умолчанию.
Дальше покажите зрелость: сведения о залогиненном пользователе в Spring Security лежат в SecurityContext и доступны через SecurityContextHolder, а в сессию его сохраняет сам фреймворк. Сессионный бин уместен для состояния вроде корзины или многошагового мастера. При нескольких инстансах сессии выносят в Spring Session с Redis или JDBC, и тогда содержимое бина должно быть Serializable. В stateless API на JWT серверной сессии нет вовсе.
Где спотыкаются
Внедряют сессионный бин в синглтон без прокси и не могут объяснить ошибку на старте.
Считают сессионный бин потокобезопасным. Две вкладки одного пользователя шлют параллельные запросы в одну сессию, и изменяемые поля нужно защищать.
Говорят, что сессия умирает при закрытии браузера. Пропадает только cookie на клиенте, а на сервере сессия вместе с бином живёт до таймаута и занимает память.