12

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

我有一个页面旨在允许人们在遵循回调 URL 后执行操作(例如,作为嵌入在电子邮件中的链接或作为某些外部身份验证或支付服务的回调 URL 参数)。就我而言,我需要重置密码。回调 URL 有一个tokenGET 参数,如下所示:

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

在页面加载时resetPasswordForm.jsf,我需要检查令牌是否有效,如果无效则重定向到主应用程序屏幕。

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

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

但是我如何使该方法在页面加载时受到打击?

不知道如何进行 - 欢迎提出建议。

4

1 回答 1

24

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

例如

<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.
}

也可以看看:

于 2011-09-20T16:09:52.497 回答