2015-01-12 41 views
0

如果不使用<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.FilterThreadLocal
  • 保存生成的文檔(或導出配置)到數據庫
  • 運輸通過將其重新發布到導出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)。

有沒有人一個好主意如何設置一個會話屬性?

回答

0

展開請求直到達到不延伸的類javax.servlet.http.HttpServletRequestWrapper可解決問題。

該請求由Liferay親切存儲,可通過ServiceContextThreadLocal.getServiceContext().getRequest()獲取。

Liferays PortalUtil只是在請求包裝程序位於以"com.liferay."開頭的包中時才展開,因此在使用自定義請求包裝器時不起作用。

public static <Type, ValueType extends Type> void setOnOriginalSession(Class<Type> type, ValueType value) { 

    HttpServletRequest request = ServiceContextThreadLocal.getServiceContext().getRequest(); 
    HttpServletRequest originalRequest = unwrapOriginalRequest(request); 
    HttpSession originalSession = originalRequest.getSession(); 

    String attributeNameForType = getAttributeNameForType(type); 
    originalSession.setAttribute(attributeNameForType, value); 
} 

private static HttpServletRequest unwrapOriginalRequest(HttpServletRequest request) { 

    while (request instanceof HttpServletRequestWrapper) { 
     HttpServletRequestWrapper httpServletRequestWrapper = (HttpServletRequestWrapper) request; 
     request = (HttpServletRequest) httpServletRequestWrapper.getRequest(); 
    } 
    return request; 
} 
相關問題