![](/img/trans.png)
[英]Retrieving Session attributes in Velocity Template set in Liferay Portlets
[英]Liferay 7 Shared Session Attributes
我正在嘗試使用Liferay共享會話屬性。
我想在不同的URL-s上的不同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);
該值始終為null。
這兩個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
任何幫助將不勝感激。 如果有人需要澄清,請告訴我。
非常感謝,PeTer
Kyle Stiemann最近撰寫了一篇關於在portlet中使用會話的好文章 。 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
變體。
但是 ,盡管這在技術上提供了對您的問題的答案,但您還希望閱讀“會話存儲是邪惡的” 。
TL; DR:不要使用上述技術。 而是消除會話的使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.