打一个bean方法并redirect一个GET请求

我在GlassFish上使用JSF 2和PrimeFaces 2.1。

我有一个页面,旨在允许用户在跟踪callbackURL(例如,embedded到电子邮件中的链接或某些外部validation或付款服务的回叫URL参数)之后执行操作。 在我的情况下,我需要重置密码。 callbackURL有一个token GET参数,如下所示:

  http://example.com/app/resetPasswordForm.jsf?token=abc123 

resetPasswordForm.jsf页面加载时,我需要检查标记是否有效,如果无效,则redirect到主应用程序屏幕。

我的想法是有一个像下面这样的bean方法:

 public String resetPasswordHandler.showResetForm(String token) { if /* token is valid */ { return "resetPasswordForm.jsf"; } else { return "main.jsf"; } } 

但是,我将如何导致该方法在页面加载中被击中?

不知道如何继续 – build议是受欢迎的。

使用<f:viewAction>在呈现视图之前触发一个bean方法,并简单地返回一个导航结果(这将隐式地被视为redirect)。

例如

 <f:metadata> <f:viewParam name="token" value="#{authenticator.token}" /> <f:viewAction action="#{authenticator.check}" /> </f:metadata> 

 @ManagedBean @RequestScoped public class Authenticator { private String token; public String check() { return isValid(token) ? null : "main.jsf"; } // Getter/setter. } 

如果您还没有使用JSF 2.2,那么可以将<f:event type="preRenderView">解决方法与ExternalContext#redirect()结合使用。

 <f:metadata> <f:viewParam name="token" value="#{authenticator.token}" /> <f:event type="preRenderView" listener="#{authenticator.check}" /> </f:metadata> 

 @ManagedBean @RequestScoped public class Authenticator { private String token; public void check() throws IOException { if (!isValid(token)) { FacesContext.getCurrentInstance().getExternalContext().redirect("main.jsf"); } } // Getter/setter. } 

也可以看看:

  • JSF 2.0中的通信 – 处理GET请求参数
  • 什么可以使用<f:元数据>,<f:viewParam>和<f:viewAction>?
  • 如何在页面加载时在后台bean中处理GET查询stringURL参数?