2016-02-16 2 views
0

Я следующий код, чтобы получить HttpSession от HttpServletRequest использованием ExternalContext в нашей среде на базе Icefaces(1.8.2) & JSF(1.2) Liferay:HttpSession является нулевым (случайным образом) при извлечении из HttpServletRequest с помощью ExternalContext

ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); 
HttpServletRequest httpServletRequest = (HttpServletRequest) (externalContext.getRequestMap().get("com.liferay.portal.kernel.servlet.PortletServletRequest"); 
HttpSession httpSession = httpServletRequest.getSession(); 

выше фрагмент кода свободно работает Liferay 6_1_0_CE_GA1, как httpSession всегда заселен.

Но, тот же код в Liferay 6_2_1_CE_GA2, я случайно получаю httpSession как null. Не могу понять, какая разница!

У меня также есть попытка получить httpServletRequest с помощью PortalUtil.getOriginalServletRequest, а затем получить httpSession, но это не решит проблему.

+1

[*** Cross Опубликовано ***] (https://www.liferay.com/community/forums/-/message_boards/message/69896568) –

ответ

1

Когда мне нужен доступ к HttpServletRequest из окна портала Liferay, я должен использовать это:

HttpServletRequest httpServletRequest = PortalUtil.getOriginalServletRequest(PortalUtil.getHttpServletRequest(renderRequest)); 

RenderRequest является объектом простиралась от класса PortletRequest. От вашего кода, вы можете получить PortletRequest объекта таким образом:

PortletRequest portletRequest = (PortletRequest) externalContext.getRequest(); 

Таким образом, результирующий код должен быть:

PortletRequest portletRequest = (PortletRequest) externalContext.getRequest(); 
HttpServletRequest httpServletRequest = PortalUtil.getOriginalServletRequest(PortalUtil.getHttpServletRequest(portletRequest)); 

Надеется, что это помогает. С уважением!

+0

Я уже пробовал это, как я уже упоминал. –

1

Прежде всего: пожалуйста, попробуйте это на 6.2 GA6, который отсутствует в течение месяца. В случае, если это ошибка, она может быть исправлена ​​во время одной из более поздних версий - теперь вы используете почти 2 года.

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

Я бы рекомендовал проверить объекты, которые вы получаете с помощью отладчика, и проверить, являются ли они обертками вокруг запроса контейнера исходного сервлета или объектов реального контейнера. Кроме того, сравните, если эти запросы направляются на портал (проверьте URL-адрес) или сам портлет - поскольку они развернуты в разных контекстах, у них будут разные сеансы (или у вас могут быть сеансы, а другие нет)

+0

Я вызываю метод утилиты в 'bean', используя атрибут действия ice: commandLink'. Фрагмент кода берется из самого метода утилиты, который возвращает «null» методу вызывающего. У меня есть аналогичный код, развернутый в двух разных контейнерах (Tomcat6) для двух разных версий liferay и наблюдения так называемого разного поведения. –

+0

@Olaf: хотя это не в спецификации _portlet_, по крайней мере спецификация _servlet_ говорит о 'getSession()': _or, если запрос не имеет сеанса, создает one_. Поэтому независимо от того, откуда он получает запрос, он никогда не должен возвращать «null». –

+0

Тобиас, звучит законно. Каков класс реализации HttpServletRequest? Тем не менее, я все еще жду еще нескольких ответов (например, это исправление для GA6? Кроме того, я на ограниченной пропускной способности и не буду следовать ссылке на перекрестную связь в настоящее время. Возможно, это будет долго разрешено или исправлено. Пока я не увижу ответ на это, я здесь спокойно здесь ... –

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