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

Posted

技术标签:

【中文标题】点击 bean 方法并在 GET 请求上重定向【英文标题】:Hit a bean method and redirect on a GET request 【发布时间】: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)——谢谢 【参考方案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.

另见:

Communication in JSF 2.0 - Processing GET request parameters What can <f:metadata>, <f:viewParam> and <f:viewAction> be used for? How do I process GET query string URL parameters in backing bean on page load?

【讨论】:

看起来很棒,效果很好!还有一个问题,当我因为 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 没有呈现响应),重定向仍然是可能的。

以上是关于点击 bean 方法并在 GET 请求上重定向的主要内容,如果未能解决你的问题,请参考以下文章

如何在GET URL上重定向页面

我希望我的 php 表单提交数据并在同一页面但不同的选项卡上重定向

在 Laravel POST 请求上重定向 302

react-native-fcm点击托盘通知后如何在特定页面上重定向

Servlet重定向和请求转发

NSURLConnection 在 iOS 设备上重定向,但不在模拟器上