在服务器上获取Portlet会话

时间:2014-08-20 14:11:44

标签: java session portlet

我的问题是:
我在一个名为first和second的门户服务器中部署了两个不同的 Portlets (只有war文件);每当用户点击 firstportlet (第一个)时,我使用以下代码设置session对象!:

第一个portlet中的代码:

String application="Welcome";
PortletRequest portletRequest = (PortletRequest) webAppAccess
                    .getHttpServletRequest()
                    .getAttribute(Constants.PORTLET_REQUEST);
portletRequest.getPortletSession(true).setAttribute("application",
                        sessionValue, 
                        PortletSession.APPLICATION_SCOPE);

log.Info("SESSION hole value:---" + portletRequest.getPortletSession(false));

每当用户点击secondportlet(第二个)时,我使用以下代码来检索在firstportlet中设置的session

第二个portlet中的代码:

PortletRequest portletRequest = (PortletRequest) webAppAccess
                    .getHttpServletRequest()
                    .getAttribute(Constants.PORTLET_REQUEST);


log.Info("SESSION hole value:---"+ portletRequest.getPortletSession(false));
log.Info("SESSION VALUE in second Portlet:----"
    + portletRequest.getPortletSession(false).getAttribute("application",
                             PortletSession.APPLICATION_SCOPE));

错误:

但是在第二个portlet中,我总是得到null值,请问任何解决方案吗?

2 个答案:

答案 0 :(得分:0)

portletSession.APPLICATION_SCOPE机制使portlet可以共享会话数据(如果它们位于同一个portlet应用程序中)。如果您有两个不在同一个war中的portlet,则它们不在同一个portlet应用程序中,因此,会话数据也不会共享。

要解决此问题,您需要将两个portlet放在同一个portlet应用程序中(相同的war,相同的portlet.xml,但仍然有两个不同的portlet。)

答案 1 :(得分:0)

DanielBarbarian的回答是正确的。要共享全局会话,portlet需要处于相同的战争中。但是还有其他方法可以在同一页面上的portlet之间共享数据,但不一定在同一个战争中。 (我假设您的门户网站容器支持JSR286标准)

  • 使用interportlet通信。这可以通知其他portlet事件。这是一个简单的发布/订阅系统,不难设置。
  • 使用全局渲染参数。

网上有两个选项的例子。