В чем разница между областями видимости Session и Global Session в Spring?

Ответ

Обе области видимости (scope) управляют жизненным циклом бина, но предназначены для разных контекстов приложения.

Session Scope

  • Контекст: Стандартное веб-приложение (Servlet API).
  • Жизненный цикл: Создается один экземпляр бина на HTTP-сессию пользователя. Уничтожается при истечении сессии.
  • Использование: Хранение пользовательских данных в рамках сессии (корзина покупок, профиль).
  • Объявление:
    @Component
    @Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
    public class UserSessionCart {
        private List<Item> items = new ArrayList<>();
        // ... методы работы с корзиной
    }

Global Session Scope

  • Контекст: Только портлет-приложения (Portlet API). Устаревшая технология.
  • Жизненный цикл: Создается один экземпляр бина на глобальную сессию портлета, которая объединяет несколько портлетов в рамках одного портлет-контейнера.
  • Использование: Общие данные для всех портлетов в рамках сессии пользователя. В современных Servlet-приложениях не используется.

Ключевое отличие: Session — для данных конкретного пользователя в Servlet-приложении. Global Session — устаревшая область для портлетов, где сессия общая для нескольких компонентов (портлетов). В 99% современных Spring-приложений нужна только обычная Session область.

Ответ 18+ 🔞

Да ты посмотри, какая дичь! Два слова почти одинаковых, а смысл — пиздец как разный. Ну ладно, session, ладно global session, ага, щас.

Вот смотри, обычная Session Scope — это как твоя личная сумка в кинотеатре. Зашёл ты, сука, на сеанс, положил туда попкорн, пиво, хуй знает что ещё. Пока сеанс идёт (пока сессия жива) — всё твоё. Кончился фильм, тебя выперли — сумку выкинули, блядь, всё пропало. В веб-приложении так и есть: залогинился — тебе создали корзину (UserSessionCart). Ходишь, тыкаешь товары — всё в неё ложится. Разлогинился или протухла сессия — корзину нахуй, в мусорку. Всё просто, как три копейки.

@Component
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class UserSessionCart {
    private List<Item> items = new ArrayList<>();
    // ... методы работы с корзиной
}

А теперь готовься охуеть. Global Session Scope — это вообще из другой оперы, ёпта. Это не для наших, современных, нормальных сервлет-приложений. Это для портлетов, сука! Технологии, которая благополучно сдохла, как мамонт, лет десять назад.

Представь себе корпоративный портал, где на одной странице хуё-маё: погода, новости, почта. Каждый такой кусок — это портлет. Так вот, Global Session — это была такая общая тумбочка в этой комнате. Положил в неё что-то — и все портлеты на странице (погода, новости, почта) могли это взять. Сессия-то одна на всю страницу (глобальная), но портлетов — несколько.

Итог, чтобы не ебал мозг:

  • Session — твоя личная хуйня в рамках твоего браузерного окошка. Нужна всегда, когда делаешь нормальный сайт.
  • Global Session — устаревшая общая тумбочка для портлетов, которые уже никто не делает. Забудь как страшный сон, если, конечно, ты не поддерживаешь какой-нибудь legacy-ад кроме ада.

Короче, в 99.9% случаев тебе нужна только первая, обычная @Scope(WebApplicationContext.SCOPE_SESSION). Вторая — это так, исторический курьёз, в рот меня чих-пых.