2013-03-09 2 views
0

Я создаю несколько портлетов для развертывания на сервере WebSphere Portal, и каждый портлет развертывается в собственной WAR. Теперь мне нужно отслеживать каждый портлет, посетив пользователя, когда он зарегистрирован на Портале. Я пытался получить идентификатор сеанса из портлета с помощью этого:Идентификатор сеанса в приложении портала

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

Но после того, как я вошел в систему, я получаю различные sessionId значения от каждого портлета/WAR я посетил. Я предполагаю, что это имеет смысл, поскольку в каждой войне есть один сеанс.

Итак, как мне получить идентификатор для сеанса портала (а не портлета)? Я вижу, что cookie JSESSIONID одинаковый в каждом HTTP-запросе, но я не уверен, что это открыто через Servlet или API портлета.

+0

попробуйте передать запрос портлета на запрос сервлета и посмотреть идентификатор сеанса. Для этого используйте класс com.ibm.wps.pe.pc.std.core.PortletUtils, я думаю, wp.pe.rt.api.jar попытается найти эту банку в каталогах PortalServer \ app или PortalServer \ base –

ответ

1

Пользователи, которые не вошли в портал, не имеют сеанса. Вы можете иметь портал для отслеживания информации о сеансе для анонимных пользователей, включив публичные сеансы.

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

Посмотрите под штурманом сервиса для изменяемого свойства.

Кроме того, я думаю, что это легче выполнить в теме или в фильтрах портлетов. Вы все равно должны иметь доступ к сеансу портала в любом из этих мест, но вам не нужно включать код в каждый портлет.

Вот ссылка на создание глобального фильтра портлетов.

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

UPDATE: Как и любой большой структуры есть много вариантов. Я предлагаю мозговой свалку того, что я могу придумать/найти. Возможно, вам придется экспериментировать и посмотреть, какой метод вы предпочитаете.

Файлы cookie JSESSIONID должны быть одинаковыми для пользователя на протяжении всего сеанса. Если сессия закончится, они получат новый файл cookie JSESSIONID. Используя это, вы сможете отслеживать пользователя через один сеанс, но, возможно, не на нескольких сеансах.

Вы можете использовать getUserPrinipal() или getRemoteUser() у объекта PortletRequest. Я не использовал этот метод в то время, поэтому вам нужно будет узнать, какая информация из них выйдет.

Существует также request.getAttribute(PortletRequest.USER_INFO). Вам нужно будет сделать некоторую конфигурацию в файле portlet.xml, чтобы вернуть определенные атрибуты в Map Map. Существует пример here. Мы используем ibm-primaryEmail вместо первого и последнего имени, например, пример моего текущего проекта.

Наконец, вы можете изучить использование API PUMA, встроенного в Portal. Это будет немного тяжелее для кодирования и, очевидно, больше контейнера, но должно быть в состоянии сделать практически любую работу, которая вам нужна для пользователей.

+0

Я хочу отслеживать портлеты, посещенные зарегистрированными пользователями. Идентификатор сеанса, похоже, тоже не работает в этом сценарии (каждая WAR управляет своим собственным значением) –

+0

Я обновил свой ответ еще несколькими идеями, чтобы попробовать. Однако вам не нужно включать публичные сеансы. И вы действительно не должны, если вам это не нужно, поскольку он добавляет некоторые издержки производительности, которые не будут вам ничего для вас здесь. –

Смежные вопросы