我在以HttpSession
为基础的Liferay环境中使用HttpServletRequest
从ExternalContext
检索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
中的代码相同,我随机获取httpSession
为null
。无法弄清楚,差异是什么!
我也尝试使用httpServletRequest
获取PortalUtil.getOriginalServletRequest
,然后从中获取httpSession
,但这并不能解决问题。
答案 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)的