Portal Application中的会话标识符

时间:2013-03-09 03:05:03

标签: session portlet portal websphere-portal jsr286

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

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

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

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

1 个答案:

答案 0 :(得分: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。使用此功能,您将能够通过单个会话跟踪用户,但可能不会跨多个会话。

您可以考虑使用PortletRequest对象的getUserPrinipal()getRemoteUser()。我有一段时间没有使用这些方法,所以你必须看看它们是什么信息。

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

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