2015-01-12 39 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; 
} 
相关问题