我正在开发一个JSF 2 Portlet,但我需要获取全局会话变量。
请求可以正常使用:
FacesContext facesContext = FacesContext.getCurrentInstance();
PortletRequest request = (PortletRequest) facesContext.getExternalContext().getRequest();
但会话为空:
PortletSession session = request.getPortletSession(false);
如果把这段代码放在liferay-portlet.xml文件中工作正常,但我不能做IPC:Inter Portlet Comunication
<!-- Portlet session -->
<private-request-attributes>false</private-request-attributes>
<private-session-attributes>false</private-session-attributes>
如何在不使用最后一个代码的情况下获取和设置变量会话?
谢谢
今天我尝试了这个:
FacesContext facesContext = FacesContext.getCurrentInstance();
PortletRequest request = (PortletRequest) facesContext.getExternalContext().getRequest();
HttpServletRequest httpRequest = PortalUtil.getHttpServletRequest(request);
HttpSession session = httpRequest.getSession(true);
System.out.println(session.getAttribute("XXXX"));
但是为空
答案 0 :(得分:4)
<private-session-attributes>false</private-session-attributes>
使用Liferay Faces已知to cause memory leaks。使用风险自负!重新排序它会起作用!
<portlet>
<portlet-name>distribution</portlet-name>
<icon>/icon.png</icon>
<instanceable>false</instanceable>
<private-session-attributes>false</private-session-attributes>
...
...
...
...
答案 1 :(得分:1)
有两个选项:
1)在PortletSession中设置属性时,请使用此方法public void setAttribute(String name,Object value,int scope),其中scope应为PortletSession.APPLICATION_SCOPE
执行此操作时,请将其更改为liferay-portlet.xml
<private-request-attributes>false</private-request-attributes>
<private-session-attributes>false</private-session-attributes>
<private-session-attributes>false</private-session-attributes>
使用Liferay Faces已知to cause memory leaks。使用风险自负! 2)使用HttpSession
代替PortletSession
,以获取HttpSession
,请使用PortalUtil.getHttpServletRequest(portletRequest)
,然后从httpServletRequest获取HttpSession。
希望这有帮助。
由于
答案 2 :(得分:1)
<private-session-attributes>false</private-session-attributes>
使用Liferay Faces已知to cause memory leaks。使用风险自负!我解决了配置liferay-portlet.xml的问题
1。)我仅使用:
更改了liferay-portlet.xml<private-session-attributes>false</private-session-attributes>
2.)在Java Class i中创建的方法:
FacesContext facesContext = FacesContext.getCurrentInstance();
PortletRequest request = (PortletRequest) facesContext.getExternalContext().getRequest();
PortletSession session = request.getPortletSession(false);
如果您获得会话属性
session.getAttribute("XXXXXX",PortletSession.APPLICATION_SCOPE);
如果您设置会话属性
session.setAttribute("NAME","VALUE",PortletSession.APPLICATION_SCOPE);
答案 3 :(得分:0)
克里斯蒂的第二个选择对我有用。当我设置
<private-session-attributes>false</private-session-attributes>
导致我的portlet部署失败。解析xml文件时出错。
我不知道为什么。 Liferay版本6.1.1