我正在尝试使用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
凯尔·斯蒂曼(Kyle Stiemann)最近写了一篇不错的文章,介绍如何在Portlet中使用会话。TL; DR:您正在使用带有属性前缀为的HttpSession "LIFERAY_SHARED_",但应使用Portlet会话:这是Liferay管理的,HttpSession可能是“模拟的”,例如,它可能不是tomcat管理的对象。
"LIFERAY_SHARED_"
引用他文章中的一种选择:
使用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可能正在使用此数据。 共享会话数据的非标准方法。
使用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);
优点:
缺点:
注意强烈建议仅使用基本类型作为会话属性。消除了对自定义序列化和类加载问题的需求。另请注意,getPortletSession此处需要带有额外范围参数的变体。
getPortletSession
但是 ,尽管从技术上讲,这为您的问题提供了答案,但是您还想阅读“会话存储是邪恶的”。
TL; DR:请勿使用上述技术。 而是消除会话的使用。