0

我正在开发一个 JSF 2 Portlet,但我需要获取全局会话变量。

该请求适用于:

FacesContext facesContext = FacesContext.getCurrentInstance();
    PortletRequest request = (PortletRequest) facesContext.getExternalContext().getRequest();

但会话为空:

PortletSession session = request.getPortletSession(false);

如果将此代码放在 liferay-portlet.xml 文件中可以正常工作,但我不能进行 IPC:Inter Portlet 通信

<!-- 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"));

但为空

4

4 回答 4

4

警告:<private-session-attributes>false</private-session-attributes>已知与 Liferay Faces 一起使用会导致内存泄漏。使用风险自负!

重新排序它将起作用!

<portlet>
    <portlet-name>distribution</portlet-name>
    <icon>/icon.png</icon>
    <instanceable>false</instanceable>
    <private-session-attributes>false</private-session-attributes>
            ...
            ...
            ...
            ...
于 2012-11-10T16:34:36.153 回答
1

有 2 个选项:

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 一起使用会导致内存泄漏。使用风险自负!

2)使用HttpSession代替PortletSession,为了得到HttpSession,请使用PortalUtil.getHttpServletRequest(portletRequest)and从httpServletRequest,得到HttpSession。

希望这可以帮助。

谢谢

于 2012-06-04T09:07:49.200 回答
1

警告:<private-session-attributes>false</private-session-attributes>已知与 Liferay Faces 一起使用会导致内存泄漏。使用风险自负!

我解决了配置 liferay-portlet.xml 的问题

1.) 我只更改了 liferay-portlet.xml:

<private-session-attributes>false</private-session-attributes>

2.) 在我创建的 Java 类中:

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);
于 2012-07-06T21:51:24.473 回答
0

克里斯蒂的第二个选项对我有用。当我设置

<private-session-attributes>false</private-session-attributes>

它导致我的 portlet 部署失败。解析 xml 文件时出错。

我不知道为什么。Liferay 版本 6.1.1

于 2012-09-13T07:40:54.087 回答