【问题标题】:Hit a bean method and redirect on a GET request点击 bean 方法并在 GET 请求上重定向
【发布时间】:2011-11-21 05:44:44
【问题描述】:

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

我有一个页面旨在允许人们在遵循回调 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";
  }
}

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

不确定如何进行——欢迎提出建议。

【问题讨论】:

  • 我在 GlassFish 上使用 JSF2(带有 Primefaces 2.1)——谢谢

标签: jsf jsf-2 query-string http-get method-invocation


【解决方案1】:

在渲染视图之前使用<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,那么您可以将 &lt;f:event type="preRenderView"&gt; 解决方法与 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.
}

另见:

【讨论】:

  • 看起来很棒,效果很好!还有一个问题,当我因为 externalContext.redirect 将 FacesMessage 添加到 FacesContext 时,faces 消息不会出现在“main.jsf”上。这正常吗?有没有办法让它发挥作用?
  • 是的,这很正常。 Faces 消息是请求范围的。重定向指示浏览器触发一个全新的 HTTP 请求。您需要在重定向 URL 中传递请求参数并让显示消息在该 URL 上截获,或者使用 true 调用 Flash#setKeepMessages() 以通过 cookie 恢复它们(然而,这反过来又存在一个奇怪的错误Mojarra 在某些情况下,因此请注意这一点,另请参阅 java.net/jira/browse/JAVASERVERFACES-1751 )。
  • 你能解释一下如何使用验证器在
  • @BalusC:view-action 组件的 action 方法在应用程序逻辑调用阶段被触发,就在绑定到某个命令按钮的 action 方法之前。而对于预渲染视图,它在渲染响应阶段被触发。我有点困惑是否可以使用预渲染视图执行重定向。那岂不是太晚了。
  • @Shirgill:只要响应没有提交(即只要 JSF 没有呈现响应),重定向仍然是可能的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 2019-10-12
相关资源
最近更新 更多