使用ExternalContext从HttpServletRequest检索时,HttpSession为null(随机)

时间:2016-02-16 08:02:09

标签: jsf liferay icefaces

我在以HttpSession为基础的Liferay环境中使用HttpServletRequestExternalContext检索Icefaces(1.8.2) & JSF(1.2)以下代码:

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中的代码相同,我随机获取httpSessionnull。无法弄清楚,差异是什么!

我也尝试使用httpServletRequest获取PortalUtil.getOriginalServletRequest,然后从中获取httpSession,但这并不能解决问题。

2 个答案:

答案 0 :(得分:1)

当我需要从Liferay portlet访问HttpServletRequest时,我必须使用它:

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));

希望这会有所帮助。此致!

答案 1 :(得分:1)

首先:请在6.2 GA6上试试这个,现在已经有一个月了。如果这是一个错误,它可能已经在其中一个版本中修复 - 你现在使用的版本已经差不多2年了。

此外,我在规范中没有注意到任何允许访问底层HttpServletRequest的内容。这并不是说这是不可能的(因为它显然是可能的),而是说行为可能会改变,因为你不在规范之内。

我建议使用调试器检查您获得的对象,并检查它们是否包围原始servlet容器的请求或实际容器的对象。此外,比较这些请求是否定向到门户网站(检查URL)或portlet本身 - 因为它们在不同的上下文中部署,它们会有不同的会话(或者一个可能有会话而另一个会话没有按' t)的