点击一个bean方法并在GET请求中重定向

12

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

我有一个页面,旨在允许人们在跟随回调URL后执行某些操作(例如作为电子邮件中嵌入的链接或作为某些外部身份验证或付款服务的回调URL参数)。 在我的情况下,我需要重置密码。 回调URL具有像这样的token GET参数:

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";
  }
}

但是我该如何在页面加载时触发该方法呢?

不确定如何继续操作,欢迎提出建议。


我正在使用JSF2(带有Primefaces 2.1)在GlassFish上 - 谢谢 - user550738
1个回答

25

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

另请参阅:


1
看起来很棒,也能正常工作!还有一个问题,当我在FacesContext中添加FacesMessage时,由于externalContext.redirect,这个faces message在“main.jsf”上似乎没有出现。这是正常的吗?是否有办法解决这个问题? - user550738
3
没问题,这很正常。Faces消息是请求范围的。重定向指示浏览器发起一个全新的HTTP请求。您需要在重定向URL中传递请求参数,让消息拦截并显示,或者调用 Flash#setKeepMessages(),并将其设置为 true 以通过cookie恢复它们(然而,在某些情况下,Mojarra目前存在一个奇怪的错误,请注意,详情请参见 http://java.net/jira/browse/JAVASERVERFACES-1751 )。 - BalusC
请问您能否解释一下如何在<f:viewParam>上使用验证器进行操作? - Salih Erikci
@BalusC:视图操作组件的操作方法会在应用逻辑调用阶段的命令按钮绑定的操作方法之前触发。而对于预渲染视图,它会在“渲染响应”阶段触发。我有点困惑,是否可以在预渲染视图中执行重定向。这样做是否已经太迟了呢? - Farhan stands with Palestine
1
@Shirgill:只要响应没有提交(即只要JSF没有呈现响应),重定向仍然是可能的。 - BalusC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接