Java 页面加载时JSF重定向

Java 页面加载时JSF重定向,java,jsf,redirect,Java,Jsf,Redirect,简短问题:是否可以进行重定向,例如当用户未登录时,当呈现页面时?是: if(!isLoggedIn) { FacesContext.getCurrentInstance().getExternalContext().redirect(url); } 您可以使用PhaseListener指定何时执行重定向。为此,您可以使用 例如 在这里,我假设用户像您通常期望的那样被放置在会话范围中。它可以是一个名为user的会话范围JSF托管bean 导航规则不适用,因为在正常的GET请求期间没有“bean操

简短问题:是否可以进行重定向,例如当用户未登录时,当呈现页面时?

是:

if(!isLoggedIn) {
FacesContext.getCurrentInstance().getExternalContext().redirect(url);
}

您可以使用
PhaseListener
指定何时执行重定向。

为此,您可以使用

例如

在这里,我假设
用户
像您通常期望的那样被放置在会话范围中。它可以是一个名为
user
的会话范围JSF托管bean


导航规则不适用,因为在正常的
GET
请求期间没有“bean操作”的方法。在即将构造托管bean时执行重定向也是行不通的,因为当在正常的
GET
请求期间构造托管bean时,响应已经开始呈现,这是一个无法返回的点(它只会生成
IllegalStateException:response ready committed
)。PhaseListener很麻烦,而且让人难以承受,因为实际上您不需要在任何JSF阶段进行监听。您只需要监听“普通”HTTP请求以及会话范围中某个对象的存在。为此,过滤器是完美的。

相位侦听器中尝试:

FacesContext ctx = FacesContext.getCurrentContext();
ctx.getApplication().getNavigationHandler()
     .handleNavigation(ctx, null, "yourOutcome");

谢谢:)。触发导航规则会很方便,但我想这是不可能的。竖起大拇指。现在,我只需要对其进行定制,使其仅在某些页面上触发。只需使这些特定页面具有通用的
url模式
,并将此筛选器映射到
web.xml
中的
url模式
。例如
/secured/*
左右。
FacesContext
过滤器中不可用,因为它在
FacesServlet
启动之前运行。FacesContext在生命周期中何时出现?它在整个生命周期中都存在。在调用FacesServlet之前,它不存在。FacesServlet启动JSF生命周期。
FacesContext ctx = FacesContext.getCurrentContext();
ctx.getApplication().getNavigationHandler()
     .handleNavigation(ctx, null, "yourOutcome");