【问题标题】:Handling an expired ViewState in JSF and Richfaces在 JSF 和 Richfaces 中处理过期的 ViewState
【发布时间】:2010-11-16 18:36:28
【问题描述】:
我有一系列相互构建的注册页面。当用户会话到期时,我有一个侦听器可以清理服务器上的所有内容,并且效果很好。但是,如果用户尝试做任何其他事情,我只想将他们重定向回该系列的第一页。但是,我的过滤器似乎无法正常工作。我不断收到 javax.faces.application.ViewExpiredException
处理此异常的最佳做法是什么?我真的不能只在 web.xml 中处理,因为这太全球化了。另外,错误页面是从一些 JSF 代码呈现的——似乎我需要使用 PhaseListener 来捕捉这种情况,因此异常不会首先发生,但我一直无法找到一个好的模型如何做到这一点。有什么想法吗?
【问题讨论】:
标签:
java
jsf
richfaces
viewexpiredexception
【解决方案1】:
我认为您是带有相位侦听器的正确轨道。基本上在第一页的会话中设置了一些东西。然后在阶段侦听器中查找会话中的值。如果它没有退出,那么做一个重定向。诀窍是在阶段侦听器过程的早期进行。
不确定您的阶段侦听器在进程中的确切位置抛出异常。
【解决方案2】:
您可以检查您的会话是否无效
boolean sessionInValid = httpServletRequest.getRequestedSessionId()
!= 空 &&
!httpServletRequest.isRequestedSessionIdValid();
这里的布尔变量 sessionInValid 将在会话以任何方式无效时返回 true。
您可以将其添加到过滤器或侦听器中,然后在您的 web.xml 文件中进行配置。
【解决方案3】:
我处理这个问题的方法是向 web.xml 添加一个过滤器,只映射到您要跟踪的 url。该过滤器检查会话是否过期,如果是,则转发到登录页面。如果在运行任何 JSF 代码之前运行过滤器,它应该可以工作。
【解决方案5】:
我过去处理此问题的方法是使用侦听器检查托管会话 bean 中的字段。如果用户会话超时,监听器会清理 mbean 并将用户标记为未登录。每个请求都通过监听器发送,如果不满足要求,则用户将被强制退出站点。我从来没有在我的日志中得到 ViewExpiredException。唯一发生此异常的情况是服务器已重新启动并且用户在具有先前活动的会话时请求页面。