簡體   English   中英

Liferay 7共享會話屬性

[英]Liferay 7 Shared Session Attributes

我正在嘗試使用Liferay共享會話屬性。

我想在不同的URL-s上的不同WAR文件中的兩個不同的portlet上使用相同的屬性,使用以下代碼:

Liferay 7無法設置全局會話屬性

我想要保存的值:單個字符串

在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM