Vaadin Session Management - как это работает?

На работе мы разрабатываем веб-приложение с помощью Vaadin. Я довольно продвинутый программист на Java. У меня тоже есть опыт общения с Ваадином. Но теперь я подошел к моменту, когда информация должна храниться в пользовательском сеансе. Такие атрибуты, как языковой стандарт, имя пользователя и т. Д.

В документации Vaadin говорится о двух разных типах сеансов, но Я действительно не понимаю разницы:

  • VaadinServletService или VaadinPortletService описан как уровень настройки низкого уровня для обработки запросов.
  • VaadinSession пользовательского интерфейса с getSession () в качестве объектов сеанса нижнего уровня .

В чем разница и какой из них использовать, когда я хочу хранить атрибуты в течение всего пользовательского сеанса, независимого от пользовательского интерфейса?


person David Fischer    schedule 08.01.2018    source источник
comment
Я думаю VaadinSession это то, что вам нужно. Соответствует одному пользователю. С каждым VaadinSession может быть связано несколько UI (например, несколько вкладок браузера).   -  person Steffen Harbich    schedule 09.01.2018
comment
@SteffenHarbich, спасибо за подсказку, Штеффен. Это странно, но пока что мы реализовали это с помощью VaadinServletService, и все работает как надо. Я не могу объяснить почему.   -  person David Fischer    schedule 15.01.2018
comment
Пожалуйста, будьте осторожны при наборе текста (регистр, знаки препинания). Этот сайт больше похож на Википедию, а не на обычный чат.   -  person Basil Bourque    schedule 28.08.2019
comment
Вы используете Vaadin 8? Вы так отметили это. Я также предлагаю добавить упоминание в текст вашего вопроса, так как между Vaadin 8 и более поздними версиями существует огромная разница.   -  person Basil Bourque    schedule 28.08.2019
comment
Страница связанного вопроса: Зарегистрировать сеанс для пользователя   -  person Basil Bourque    schedule 29.10.2019


Ответы (1)


Если в Vaadin 8 у вас есть простая иерархия области действия на трех уровнях.

  • ServletContext
    Представляет всю вашу сеть Vaadin приложение.
  • VaadinSession
    Представляет каждого пользователя рабочая сессия.
  • UI
    Представляет каждый веб-браузер / вкладку в сеансе (Vaadin поддерживает многооконные приложения, что довольно удивительно).

Первый является стандартной частью каждого сервлета Java, определенного в спецификации.

Второй - это оболочка для сеанса, также определенная в спецификации Java Servlet.

На самом деле Vaadin - это один огромный сервлет, поэтому он несет в себе функции контекста и сеанса.

Класс UI уникален для Vaadin. Он представляет собой содержимое окна / вкладки веб-браузера. Vaadin поддерживает многооконные приложения, отслеживая все открытые окна / вкладки как часть сеанса, что является очень приятной особенностью Vaadin.

Для хранения общегосударственного приложения используйте стандартный объект ServletContext. Он содержит коллекцию «ключ-значение», известную как «атрибуты». Ключ имеет тип String, а значение имеет значение _ 6_. Вызов методов setAttribute, getAttribute и removeAttribute. Используйте эту коллекцию для любых объектов, к которым вам может потребоваться доступ для любого из ваших пользователей, во время их сеансов. Кстати, вы можете узнать о ServletContextListener, чтобы подключиться к запуску и выходу вашего веб-приложения.

Класс VaadinSession содержит такую ​​же коллекцию "ключ-значение" с аналогичными "атрибутивными" методами. Используйте это для отслеживания элементов на протяжении всего сеанса работы пользователя, при этом они могут открывать / закрывать несколько окон / вкладок вашего приложения. Например, в сеансе вы сохраните выбор пользователя Spirit Animal, его изображение аватара и тот факт, что этот человек был аутентифицирован с помощью учетных данных имени пользователя и пароля. См. Эту страницу в руководстве, Настройка и чтение атрибутов сеанса .

Если вы хотите сохранить настройки для каждого окна, например, их выбор цвета фона или светлый / темный режим, сохраните что-нибудь на UI. К сожалению, этот класс не имеет удобного хранилища ключей и значений, о котором я знаю. Поэтому вам нужно добавить свои собственные Map или некоторые другие переменные-члены в ваш UI подкласс.

Для получения дополнительной информации см. мой ответ на аналогичный вопрос. Я сделал там отличные диаграммы. Этот вопрос касается Vaadin 7, но, насколько я смутно припоминаю, эти концепции переносятся между 7 и 8.

Что касается VaadinService и _ 16_, я никогда точно не понимал их роль. Кажется, что они представляют различные аспекты всей вашей сети Vaadin во время выполнения. Но ни один из них не имеет удобной коллекции ключей и значений, как VaadinSession. (Если вы используете Vaadin Flow версий 10+, см. VaadinContext, класс, который представляет все ваше веб-приложение и содержит удобную коллекцию «атрибутов» «ключ-значение».)

person Basil Bourque    schedule 27.08.2019