点击bean方法并重定向GET请求

Rob*_*ume 12 jsf http-get method-invocation query-string jsf-2

我在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";
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,如何在页面加载时使该方法受到影响?

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

Bal*_*usC 25

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

例如

<f:metadata>
    <f:viewParam name="token" value="#{authenticator.token}" />
    <f:viewAction action="#{authenticator.check}" />
</f:metadata>
Run Code Online (Sandbox Code Playgroud)

@ManagedBean
@RequestScoped
public class Authenticator {

    private String token;

    public String check() {
        return isValid(token) ? null : "main.jsf";
    }

    // Getter/setter.
}
Run Code Online (Sandbox Code Playgroud)

如果您还没有使用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>
Run Code Online (Sandbox Code Playgroud)

@ManagedBean
@RequestScoped
public class Authenticator {

    private String token;

    public void check() throws IOException {
        if (!isValid(token)) {
            FacesContext.getCurrentInstance().getExternalContext().redirect("main.jsf");
        }
    }

    // Getter/setter.
}
Run Code Online (Sandbox Code Playgroud)

也可以看看:

  • 是的,这是正常的.Faces消息是请求范围.重定向指示浏览器触发全新的HTTP请求.您需要在重定向URL中传递请求参数并在其上显示消息拦截,或者调用[`Flash #setKeepMessages()`](http://download.oracle.com/javaee/6/api/ javax/faces/context/Flash.html#setKeepMessages%28boolean%29)使用`true`以便通过cookie恢复它们(在某些情况下,这反过来又是Mojarra的一个好奇的bug,所以要注意这一点,另见http://java.net/jira/browse/JAVASERVERFACES-1751). (3认同)