0

我正在构建几个 Portlet 以部署在 WebSphere Portal Server 上,每个 Portlet 都部署在它自己的 WAR 中。现在,我需要跟踪用户在登录门户时访问的每个 Portlet。我试图使用以下方法从 Portlet 获取会话标识符:

HttpServletRequest servletRequest = PortletUtils.getHttpServletRequest(request);
String sessionId = servletRequest.getSession().getId();

但是在我登录后,我sessionId从我访问的每个 Portlet/WAR 中获得了不同的值。我想这是有道理的,因为每个 WAR 都有一个会话范围。

那么,我如何获得门户会话(而不是 Portlet 会话)的标识符?我看到JSESSIONID每个 HTTP 请求中的 cookie 都是相同的,但我不确定它是否通过 Servlet 或 Portlet API 公开。

4

1 回答 1

1

未登录门户的用户没有这样的会话。您可以通过启用公共会话让 Portal 跟踪匿名用户的会话信息。

http://www-10.lotus.com/ldd/portalwiki.nsf/xpDocViewer.xsp?lookupName=IBM+WebSphere+Portal+7+Product+Documentation#action=openDocument&res_title=Portal_configuration_services_wp7&content=pdcontent

在导航器服务下查找要更改的属性。

另外,我认为这可能更容易在主题或 portlet 过滤器中完成。您应该仍然可以在其中任何一个地方访问 Portal 会话,但您不需要在每个 portlet 中都包含代码。

这是用于创建全局 portlet 过滤器的链接。

http://wpcertification.blogspot.com/2010/11/applying-global-filter-to-all-portlets.html

更新:像任何大型框架一样,有很多选择。我将提供一个我能想到/找到的大脑转储。您可能需要进行试验,看看您更喜欢哪种方法。

在整个会话期间,用户的 JSESSIONID cookie 应该相同。如果会话过期,他们将获得一个新的 JSESSIONID cookie。使用它,您将能够通过单个会话跟踪用户,但可能无法跨多个会话。

您可以考虑使用getUserPrinipal()getRemoteUser()关闭 PortletRequest 对象。我已经有一段时间没有使用这些方法了,所以你必须看看它们会产生什么信息。

还有request.getAttribute(PortletRequest.USER_INFO). 您必须在 portlet.xml 中进行一些配置,以使某些属性在返回的 Map 中可用。这里有一个例子。我们使用 ibm-primaryEmail 而不是我当前项目中的示例中的名字和姓氏。

最后,您可以考虑使用 Portal 中内置的 PUMA API。它在编码上会有点重,并且显然更特定于容器,但应该能够完成您需要的与用户相关的任何工作。

于 2013-03-09T05:11:31.397 回答