2013-03-09 24 views
0

我正在構建幾個Portlet以部署在WebSphere Portal Server上,並且每個Portlet都部署在它自己的WAR中。現在,我需要跟蹤用戶在Portal上登錄時訪問的每個Portlet。我試圖使用此Portlet中獲取會話標識符:門戶應用程序中的會話標識

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

但我登錄後,我從每個portlet/WAR筆者走訪得到不同sessionId值。我猜這是有道理的,因爲每個WAR有一個會話範圍。

那麼,如何獲得門戶會話的標識符(不是門戶一)?我看到JSESSIONID Cookie在每個HTTP請求中都是相同的,但我不確定它是否通過Servlet或Portlet API公開。

+0

嘗試將portlet請求轉換爲servlet請求並查看會話ID。爲此,請使用com.ibm.wps.pe.pc.std.core.PortletUtils類,我認爲wp.pe.rt.api.jar嘗試在PortalServer \ app或PortalServer \ base目錄中找到此jar – 2013-03-16 20:13:47

回答

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

UPDATE:像什麼大的框架,有很多的選擇。我會提供我能想到/發現的大腦轉儲。您可能需要試驗一下,看看您喜歡哪種方法。

JSESSIONID cookie在整個會話中應該與用戶相同。如果會話過期,他們會得到一個新的JSESSIONID cookie。使用此功能,您可以通過單個會話跟蹤用戶,但可能無法跨多個會話跟蹤用戶。

您可以考慮使用getUserPrinipal()getRemoteUser()關閉PortletRequest對象。我有一段時間沒有使用這些方法,所以你必須看看他們有什麼信息。

還有request.getAttribute(PortletRequest.USER_INFO)。您必須在portlet.xml中執行一些配置,才能在返回的Map中提供某些可用的屬性。有一個例子here。我們使用的是ibm-primaryEmail,而不是像當前項目中的例子那樣的名字和姓氏。

最後,您可以使用內置於Portal中的PUMA API進行研究。在編碼方面它會稍微沉重一些,而且顯然它更具特定容器,但應該能夠完成與用戶相關的任何工作。

+0

我想跟蹤記錄用戶訪問的Portlets。會話ID在這種情況下似乎不起作用(每個WAR管理它自己的值) – 2013-03-09 15:15:12

+0

我已經更新了我的答案,並提供了一些更多的想法來嘗試。儘管如此,您不需要啓用公共會話。如果你不需要它,你就不應該這樣做,因爲它增加了一些性能開銷,在這裏不會爲你做任何事情。 – 2013-03-09 16:24:57