如何检测是否调用了以前的重定向?

时间:2013-09-07 15:37:20

标签: jsf java-ee

验证支持bean中preRenderView事件中的视图参数我发现即使任何方法使用以下方法调用重定向,每个事件<f:event>仍会被触发:

FacesContext.getExternalContext().redirect(url);

如果在多个事件中调用重定向,则将抛出非法状态错误异常。

为了防止这种情况,我想知道是否以及如何通常检测到已经调用了重定向,并处理第一次或最后一次重定向。

1 个答案:

答案 0 :(得分:1)

您可以使用FacesContext#getRenderResponse()确认是否已启动进入RENDER_RESPONSE阶段的流程(或订单)。这将检查组件是否已调用renderResponse()方法,并通知运行时将控制权转移到RENDER_RESPONSE阶段。通常,此时尝试对响应流执行任何操作都是不安全的。

RENDER_RESPONSE阶段的另一条路线是FacesContext#responseComplete()方法。但是,这并不直接触发响应处理。相反,它是向运行时指示已到达RENDER_RESPONSE的最终标志。

因此,根据规范,FacesContext#getResponseComplete()是验证响应状态的最终检查

  

在某些情况下,可能已为请求调用了renderResponse()和responseComplete()。在这种情况下,JSF实现必须尊重   在检查renderResponse()是否被调用之前,调用(如果已经做出)的responseComplete()调用。