Liferay 7 общих атрибутов сеанса - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь использовать атрибуты общего сеанса Liferay.

Я хотел бы использовать один и тот же атрибут на двух разных портлетах в разных файлах WAR на разных URL-адресах, используя следующий код, основанный на:

Liferay 7 не может установить глобальный атрибут сеанса

Значение, которое я хочу сохранить: одна строка

Настройка в портлете 1:

String sharedKey = "LIFERAY_SHARED_" + key;
HttpSession session = PortalSessionThreadLocal.getHttpSession();
session.setAttribute(sharedKey, bean);

Портлет 1 может сохранять, сбрасывать и использовать атрибуты штрафа.

Чтение в портлете 2:

key = "LIFERAY_SHARED_" + key;
HttpSession session = PortalSessionThreadLocal.getHttpSession();
Object bean = session.getAttribute(key);

Это значение всегда равно нулю.

Оба портлета являются портлетами Spring MVC.

Оба портлета имеют:

<instanceable>false</instanceable>
<private-session-attributes>false</private-session-attributes>
<requires-namespaced-parameters>false</requires-namespaced-parameters>

В своих портлетах liferay XML-ы.

Также оба портлета расширяют org.springframework.web.portlet.DispatcherPortlet.

Версия Liferay:

Liferay DXP Digital Enterprise 7.0.10 GA1

Любая помощь будет принята с благодарностью.Дайте мне знать, если кому-то понадобятся какие-либо разъяснения.

Большое спасибо, PeTer

1 Ответ

0 голосов
/ 07 февраля 2019

Кайл Штиманн недавно написал хорошую статью об использовании сессий в портлетах.TL; DR: вы используете HttpSession с префиксом атрибута "LIFERAY_SHARED_", но вы должны использовать сеанс портлета: это то, чем управляет Liferay, HttpSession может быть «имитирован», например, это может быть не тот объект, которым управляет tomcat.

Чтобы процитировать одну из опций из его статьи:

Используйте префиксы Liferay session.shared.attributes (например, LIFERAY_SHARED_) для совместного использования одного или нескольких атрибутов сеанса между портлетами в разных приложениях./WARs.

Liferay предоставляет определенные атрибуты сеанса всем портлетам на основе определенных значений префикса.Хотя эти префиксы можно настроить с помощью portal-ext.properties, я рекомендую использовать один из префиксов по умолчанию: LIFERAY_SHARED _.

Например:

// Portlet A 
portletRequest.getPortletSession(true)
    .setAttribute("LIFERAY_SHARED_" + CONSTANTS.ATTR_NAME, "value", 
                  PortletSession.APPLICATION_SCOPE);

// Portlet B (in a different WAR) 
String attrValue = portletRequest.getPortletSession(true)
    .getAttribute("LIFERAY_SHARED_" + CONSTANTS.ATTR_NAME, 
                  PortletSession.APPLICATION_SCOPE);

Плюсы:

  • Предоставляет только необходимые атрибуты другим портлетам (вместо предоставления всего сеанса).

Минусы:

  • Предоставляет атрибуты сеанса всемпортлеты.
  • Тесная связь без указания того, какие другие портлеты могут использовать эти данные.
  • Нестандартный метод обмена данными сеанса.

Обратите внимание наНастоятельно рекомендуется использовать только примитивные типы в качестве атрибутов сеанса.Устраните необходимость в пользовательских сериализационных и загрузках классов.Также обратите внимание, что здесь требуется вариант getPortletSession с дополнительным параметром области действия.

Но , поскольку это технически дает ответ на ваш вопрос, вы также хотите прочитать "Хранилище сессии - зло" .

TL; DR: не используйте вышеописанную технику.Скорее исключите использование сессий.

...