我构建了几个要在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公开。
答案 0 :(得分:1)
未登录门户网站的用户没有这样的会话。您可以让Portal通过启用公共会话来跟踪匿名用户的会话信息。
在导航器服务下查找要更改的属性。
另外,我认为在主题或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。它在编码上会更加沉重,显然更具容器特性,但应该能够完成与用户相关的任何工作。