如果不使用<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)。
有没有人一个好主意如何设置一个会话属性?