1 回答

TA贡献1785条经验 获得超4个赞
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:不要使用上述技术。而是消除会话的使用。
添加回答
举报