Идентификатор сеанса в приложении портала

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

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

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

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


person Carlos Gavidia-Calderon    schedule 09.03.2013    source источник
comment
попробуйте преобразовать запрос портлета в запрос сервлета и посмотрите на идентификатор сеанса. Для этого используйте класс com.ibm.wps.pe.pc.std.core.PortletUtils из, я думаю, wp.pe.rt.api.jar, попробуйте найти этот jar в каталогах PortalServer\app или PortalServer\base   -  person Georgy Gobozov    schedule 17.03.2013


Ответы (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

ОБНОВЛЕНИЕ: Как и в любом большом фреймворке, существует множество вариантов. Предложу дамп мозгов, что я могу придумать/найти. Возможно, вам придется поэкспериментировать и посмотреть, какой метод вы предпочитаете.

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

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

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

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

person Nick Roth    schedule 09.03.2013
comment
Я хочу отслеживать портлеты, которые посещают зарегистрированные пользователи. Идентификатор сеанса, похоже, тоже не работает в этом сценарии (каждый WAR управляет своим собственным значением) - person Carlos Gavidia-Calderon; 09.03.2013
comment
Я обновил свой ответ еще несколькими идеями, которые можно попробовать. Однако вам не нужно включать публичные сеансы. И вы действительно не должны, если вам это не нужно, так как это добавляет некоторые накладные расходы на производительность, которые ничего не сделают для вас здесь. - person Nick Roth; 09.03.2013