一尘不染

Liferay 7共享的会话属性

tomcat

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

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

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

在portlet 1中进行设置:

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

Portlet 1可以保留,重置和使用精细属性。

在portlet 2中阅读:

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

此值始终为空。

两个portlet都是Spring MVC portlet。

这两个portlet都具有:

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

在他们的liferay portlet中使用XML-s。

同样,两个Portlet都扩展了org.springframework.web.portlet.DispatcherPortlet。

Liferay版本:

Liferay DXP Digital Enterprise 7.0.10 GA1

任何帮助将不胜感激。让我知道是否有人需要澄清。

非常感谢,PeTer


阅读 275

收藏
2020-06-16

共1个答案

一尘不染

凯尔·斯蒂曼(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);

优点:

  • 仅将必要的属性公开给其他Portlet(而不是公开整个会话)。

缺点:

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

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

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

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

2020-06-16