凯尔·斯蒂曼(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 AportletRequest.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:请勿使用上述技术。 而是消除会话的使用。



