【发布时间】:2012-02-02 17:26:59
【问题描述】:
在我们的项目(JBoss 7.0.2、JSF 2)中,我们致力于在用户导航期间捕获所有异常并将它们重定向到漂亮的错误页面的解决方案。
我使用了ExceptionHandler,灵感来自网上很多examples 和tutorials。
我设法在没有太大困难的情况下实现了重定向功能:在ExceptionHandler.handle() 方法中,对于某些例外情况(视图/会话过期、未经身份验证的用户询问被拒绝的页面……)我在登录页面上重定向用户走过一段美好的时光
FacesContext.getCurrentInstance().getExternalContext().redirect(myRedirectPage);
带有一个包含原始 url base64 编码的附加查询参数,并且在成功验证后,我使用相同的重定向机制将用户发送回他们的页面。
问题在于 JSF 操作上的 ViewExpiredException,例如,当用户在其视图过期后单击任何按钮或链接,以及操作或 actionListener、同步或 ajax 样式,例如
<h:commandButton action="#{myBean.myAction}" value="do that" />
或
<h:commandLink value="do that too">
<f:ajax render=":aZone" execute="@form" listener="#{myBean.myOtherAction}" />
</h:commandLink>
我无法在ExceptionHandler.handle() 方法中获取查询参数。
我尝试将我的参数放在 f:metadata 部分中,例如
<f:metadata>
<f:viewParam name="myParam" value="#{myBean.myParam}" />
</f:metadata>
并将它们包含在操作中,因此在绑定到按钮操作的方法中我返回了
"myPage.xhtml?includeViewParams=true"
但它什么也没改变 :-/
我做错了吗?我应该在哪里找到查询参数?是在
FacesContext.getCurrentInstance().getExternalContext().getRequest()
** 更新 **
正如 cmets 中所说,视图参数在 ViewExpiredException 之后不再可用(实际上非常明显),因此参数将存储在其他地方(@BalusC 很快建议在请求范围内或通过 cookie)。
【问题讨论】:
标签: exception-handling jsf-2 navigation