Liferay Portlet和JSF:在渲染阶段重定向

Jul*_*ont 5 redirect portlet liferay jsf-2 liferay-6

我有一个问题是实现一个简单的HTTP重定向.

我使用Liferay 6.0.6,我们的portlet是用JSF2.0/PortletFaces构建的.

我想在加载视图时调用重定向(而不是在触发操作时).目前,我的函数由PreRenderView监听器调用.

<f:metadata>
  <f:event listener="#{myControler.dispatch}" type="preRenderView" />
</f:metadata>
Run Code Online (Sandbox Code Playgroud)

在这个函数中,我可以检查权限,做其他的事情,在某些情况下,我想将用户重定向到一个新的页面(而不是另一个视图).

我尝试了几种方法,但没有成功.具体来说,我认为这种方法可行:

getFacesContext().getExternalContext().redirect(url);
getFacesContext().responseComplete()
// => Can only redirect during ACTION_PHASE
Run Code Online (Sandbox Code Playgroud)

这个错误是合乎逻辑的,但是有一个强制重定向的解决方案.

它可以在另一个函数中实现,否则,我只需要Hibernate Session(在渲染阶段的开头设置)

你有想法解决这个问题吗?
谢谢!

ps:<redirect />或者?faces-redirect不使用portlet.

Ola*_*ock 10

您无法在渲染阶段按设计执行此操作.原因:

  • Portlet可能是异步呈现的,因此在呈现portlet时可能已经显示了该页面
  • 页面的某些部分可能已经传送到客户端,因此HTTP头已经发送 - 因此,按照设计,您无法在呈现阶段访问它们
  • 如果在同一页面上呈现的两个portlet决定他们想要转发到另一个页面,那么预期结果会是什么?谁会赢?

一个hacky解决方法是渲染一些javascript重定向,但这是非门户类的veeeery并且可以搞砸其他人的期望(此外,页面的某些部分可能已经被渲染,导致用户只填写表单以便由您重定向javascript例程.

请重新考虑问题并提出一个不同的解决方案 - 在门户环境中真的值得这样做.