6

我有一系列相互构建的注册页面。当用户会话到期时,我有一个侦听器可以清理服务器上的所有内容,并且效果很好。但是,如果用户尝试做任何其他事情,我只想将他们重定向回该系列的第一页。但是,我的过滤器似乎无法正常工作。我不断收到 javax.faces.application.ViewExpiredException

处理这个异常的最佳实践是什么?我真的不能只在 web.xml 中处理,因为这太全球化了。另外,错误页面是从一些 JSF 代码呈现的——似乎我需要使用 PhaseListener 来捕捉这种情况,因此异常不会首先发生,但我一直无法找到一个好的模型如何做到这一点。有任何想法吗?

4

5 回答 5

2

Richfaces 有自己的处理 ViewExpiredException 的机制,请查看Richfaces 文档

于 2009-08-18T17:25:25.757 回答
1

我处理这个问题的方法是向 web.xml 添加一个过滤器,只映射到您要跟踪的 url。该过滤器检查会话是否过期,如果是,则转发到登录页面。如果在运行任何 JSF 代码之前运行过滤器,它应该可以工作。

于 2009-08-18T16:21:18.930 回答
1

我认为您是带有相位侦听器的正确轨道。基本上在第一页的会话中设置了一些东西。然后在阶段侦听器中查找会话中的值。如果它没有退出,那么做一个重定向。诀窍是在阶段侦听器过程的早期进行。不确定您的阶段侦听器在过程中的确切位置抛出异常。

于 2009-08-04T20:47:20.313 回答
1

我过去处理这个问题的方法是使用一个侦听器来检查托管会话 bean 中的一个字段。如果用户会话超时,监听器会清理 mbean 并将用户标记为未登录。每个请求都通过监听器发送,如果不满足要求,则用户将被强制退出站点。我从来没有在我的日志中得到 ViewExpiredException。唯一发生此异常的情况是服务器已重新启动并且用户在具有先前活动会话时请求页面。

于 2009-08-31T03:03:30.370 回答
0

您可以检查您的会话是否无效

boolean sessionInValid = httpServletRequest.getRequestedSessionId() != null && !httpServletRequest.isRequestedSessionIdValid();

如果会话以任何方式无效,布尔变量 sessionInValid 将在此处返回 true。

您可以将其添加到过滤器或侦听器中,然后在 web.xml 文件中进行配置。

于 2009-08-06T07:01:44.490 回答