Liferay 7 共享会话属性

Pet*_*zki 3 java tomcat liferay

我正在尝试使用 Liferay 共享会话属性。

我想使用以下代码在不同 URL 上的不同 WAR 文件中的两个不同 portlet 上使用相同的属性:

Liferay 7 无法设置全局会话属性

我想保存的值:单个字符串

在 portlet 1 中设置:

String sharedKey = "LIFERAY_SHARED_" + key;
HttpSession session = PortalSessionThreadLocal.getHttpSession();
session.setAttribute(sharedKey, bean);
Run Code Online (Sandbox Code Playgroud)

Portlet 1 能够很好地保留、重置和使用属性。

在 portlet 2 中读取:

key = "LIFERAY_SHARED_" + key;
HttpSession session = PortalSessionThreadLocal.getHttpSession();
Object bean = session.getAttribute(key);
Run Code Online (Sandbox Code Playgroud)

该值始终为空。

这两个 portlet 都是 Spring MVC portlet。

两个 portlet 都具有:

<instanceable>false</instanceable>
<private-session-attributes>false</private-session-attributes>
<requires-namespaced-parameters>false</requires-namespaced-parameters>
Run Code Online (Sandbox Code Playgroud)

在他们的 liferay portlet XML-s 中。

此外,这两个 portlet 都扩展了 org.springframework.web.portlet.DispatcherPortlet。

Liferay版本:

Liferay DXP 数字企业版 7.0.10 GA1

任何帮助将不胜感激。如果有人需要任何澄清,请告诉我。

非常感谢,彼得

Ola*_*ock 5

Kyle Stiemann 最近写了一篇关于在 portlet 中使用会话的好文章。TL;DR:您正在使用带有前缀属性的 HttpSession "LIFERAY_SHARED_",但您应该使用 portlet 会话:这就是 Liferay 管理的内容,HttpSession 可能是“模拟的”,例如,它可能不是 tomcat 管理的对象。

引用他文章中的一个选项:

使用 Liferay session.shared.attributes 前缀(例如 LIFERAY_SHARED_)在不同应用程序/WAR 中的 portlet 之间共享一个或多个会话属性。

Liferay 根据某些前缀值向所有 portlet 公开某些会话属性。尽管这些前缀可以通过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);
Run Code Online (Sandbox Code Playgroud)

优点:

  • 只向其他 portlet 公开必要的属性(而不是公开整个会话)。

缺点:

  • 向所有 portlet 公开会话属性。
  • 紧密耦合而不指示哪些其他 portlet 可能正在使用此数据。
  • 共享会话数据的非标准方法。

请注意,强烈建议仅使用原始类型作为会话属性。消除自定义序列化和类加载问题的需要。getPortletSession另请注意,此处需要带有附加范围参数的变体。

但是,尽管这在技术上为您的问题提供了答案,但您还想阅读“会话存储是邪恶的”

TL;DR:不要使用上述技术。而是消除会话的使用。