Liferay 7 共享会话属性
Liferay 7 Shared Session Attributes
我正在尝试使用 Liferay 共享会话属性。
我想在不同 WAR 文件中的两个不同 portlet 上使用相同的属性,在不同 URL-s 上使用以下代码基于:
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。
两个 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
如有任何帮助,我们将不胜感激。
如果有人需要任何说明,请告诉我。
非常感谢,
彼得
Kyle Stiemann 最近在 portlet 中编写了 nice article on using sessions。 TL;DR:您正在使用带有前缀 "LIFERAY_SHARED_"
属性的 HttpSession,但您应该使用 portlet 会话:这就是 Liferay 管理的内容,HttpSession 可能是 "simulated",例如它可能不是 tomcat 管理的对象。
引用他文章中的一个选项:
Use Liferay session.shared.attributes prefixes (such as
LIFERAY_SHARED_) to share one or more session attributes between
portlets in different applications/WARs.
Liferay exposes certain session attributes to all portlets based on
certain prefix values. Although these prefixes are configurable via
portal-ext.properties, I recommend using one of the default prefixes:
LIFERAY_SHARED_.
For example:
// 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);
Pros:
- Only exposes the necessary attribute(s) to other portlets (instead of exposing the entire session).
Cons:
- Exposes session attribute(s) to all portlets.
- Tight coupling without indicating which other portlets might be utilizing this data.
- Non-standard method of sharing session data.
请注意,强烈建议仅使用原始类型作为会话属性。消除自定义序列化和类加载问题的需要。另请注意,此处需要带有附加范围参数的 getPortletSession
变体。
但是,尽管这在技术上为您的问题提供了答案,但您还想阅读 "Session Storage is Evil"。
TL;DR: 不要使用上面的技巧。而是消除会话的使用。
我正在尝试使用 Liferay 共享会话属性。
我想在不同 WAR 文件中的两个不同 portlet 上使用相同的属性,在不同 URL-s 上使用以下代码基于:
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。
两个 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
如有任何帮助,我们将不胜感激。 如果有人需要任何说明,请告诉我。
非常感谢, 彼得
Kyle Stiemann 最近在 portlet 中编写了 nice article on using sessions。 TL;DR:您正在使用带有前缀 "LIFERAY_SHARED_"
属性的 HttpSession,但您应该使用 portlet 会话:这就是 Liferay 管理的内容,HttpSession 可能是 "simulated",例如它可能不是 tomcat 管理的对象。
引用他文章中的一个选项:
Use Liferay session.shared.attributes prefixes (such as LIFERAY_SHARED_) to share one or more session attributes between portlets in different applications/WARs.
Liferay exposes certain session attributes to all portlets based on certain prefix values. Although these prefixes are configurable via portal-ext.properties, I recommend using one of the default prefixes: LIFERAY_SHARED_.
For example:
// 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);
Pros:
- Only exposes the necessary attribute(s) to other portlets (instead of exposing the entire session).
Cons:
- Exposes session attribute(s) to all portlets.
- Tight coupling without indicating which other portlets might be utilizing this data.
- Non-standard method of sharing session data.
请注意,强烈建议仅使用原始类型作为会话属性。消除自定义序列化和类加载问题的需要。另请注意,此处需要带有附加范围参数的 getPortletSession
变体。
但是,尽管这在技术上为您的问题提供了答案,但您还想阅读 "Session Storage is Evil"。
TL;DR: 不要使用上面的技巧。而是消除会话的使用。