我试图用Liferay的共享会话属性。
我想使用相同的属性基于在不同的URL-S使用下面的代码不同WAR文件的两个不同的portlet:
Liferay 7 not able to set the global session attribute
价值我想保存:单串
设置在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有:
<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数字企业7.0.10 GA1
任何帮助将不胜感激。让我知道,如果有人需要任何澄清。
非常感谢,彼得
凯尔Stiemann最近写在portlet的nice article on using sessions。 TL; DR:您正在使用与属性前缀"LIFERAY_SHARED_"
HttpSession中,但你应该使用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
与额外的范围参数的变化就在这里需要。
但是,不亚于这在技术上提供了一个回答你的问题,你也想读"Session Storage is Evil"。
TL; DR:不要使用上面的方法。相反杜绝使用会话。