JSF:如何根据特定FacesContext会话属性的值将用户重定向到另一个页面

在我的JSF应用程序中,如果会话属性(如userRole)的值为“contributor”,则需要将用户从页面A重定向到页面B,如果是“作者”,则需要将用户重定向到页面C.

我被告知我必须实现页面监听器或会话监听器。 虽然我理解编写一个监听器类是非常简单和标准的,但我不知道如何在JSF页面本身上设置它(听取会话)。

任何人?

会话侦听器( HttpSessionListener )不适合,因为它没有对当前HTTP请求/响应的引用,这对于更改请求/响应目标是必需的。

使用filter。 要了解有关filter的更多信息,请查看我们的servlet-filters 标签信息页面 。 请注意,会话范围的JSF托管bean本身存储为HttpSession属性,托管bean名称为key。 您可以在doFilter()方法中访问它们,如下所示:

 Bean bean = (Bean) ((HttpServletRequest) request).getSession().getAttribute("bean"); 

或者,当基于POST操作确定它时,只需在托管bean操作方法中返回不同的结果。 然后只使用(隐式)JSF导航。 伪:

 public String submit() { if (user is contributor) return "pageB"; if (user is author) return "pageC"; return "pageA"; }