如果不使用<private-session-attributes>false</private-session-attributes>
與Liferay 6.2.10和Liferay-Faces-Bridge 3.2.4,是否可以只寫一個屬性到原始會話?如何訪問Liferay portlet請求中的JSF bean中的servlet會話屬性?
- 在JSF-bean/portlet中,我們配置了一個必須可以通過servlet下載的導出文件(在同一個WAR中)。
- 我們希望通過會話共享一個特定的對象,以便在門戶內部使用某些JSTL魔術。
我發現除了設置<private-session-attributes>false</private-session-attributes>
沒有別的辦法,但污染有很多JSF特有的,沒有人在用戶全局會話需要更具體的portlet對象的會話。由於這場戰爭中的大多數portlet都需要進行通信,所以我不得不將所有切換到公共會話屬性或使用IPC。
我嘗試了幾種方法,只產生積極的結果,而不使用私有會話屬性。
ServiceContextThreadLocal.getServiceContext().getRequest().getSession().setAttribute("SERVICE_CONTEXT", true);
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
// Does not matter which way
// PortletSession portletSession = (PortletSession)externalContext.getSession(false);
PortletSession portletSession = ((PortletRequest) externalContext.getRequest()).getPortletSession();
portletSession.setAttribute("PORTLET_SESSION_PORTLET_SCOPE", true, PortletSession.PORTLET_SCOPE);
portletSession.setAttribute("PORTLET_SESSION_APPLICATION_SCOPE", true, PortletSession.APPLICATION_SCOPE);
HttpServletRequest httpServletRequest = PortalUtil.getHttpServletRequest((PortletRequest) externalContext.getRequest());
httpServletRequest.getSession().setAttribute("EXTERNAL_CONTEXT_SERVLET_REQUEST_SESSION", true);
HttpServletRequest outerRequest = PortalUtil.getOriginalServletRequest(httpServletRequest);
outerRequest.getSession().setAttribute("EXTERNAL_CONTEXT_SERVLETS_SERVLET_REQUEST", true);
,我想,以避免其他選項是:
- 使用
javax.servlet.Filter
與ThreadLocal
- 保存生成的文檔(或導出配置)到數據庫
- 運輸通過將其重新發布到導出servlet,通過客戶端進行配置。
這個answer建議使用帶有ApplicationScoped變量的portletSession,但是我無法獲得PortletSession。
對於設置<private-session-attributes>false</private-session-attributes>
我得到的原始會話設置以下屬性:
- TEST_WITH_EXTERNAL_CONTEXT_SERVLET_REQUEST_SESSION
- TEST_WITH_PORTLET_SESSION_APPLICATION_SCOPE
- TEST_WITH_SERVICE_CONTEXT
- war_app_name_whatever TEST_WITH_PORTLET_SESSION_PORTLET_SCOPE
以及在全球用戶會話中可見的大量其他對象(> 50)。
有沒有人一個好主意如何設置一個會話屬性?