1

方法

public void beforePhase(PhaseEvent event)
public void afterPhase(PhaseEvent event)

在与

<p:commandButton value="Login" action="#{checkUser.login}" ajax="false" />

当我尝试实现注销功能时,现在必须按两次按钮才能离开页面。

有没有办法在上面提到的“阶段侦听器”方法之前调用“命令按钮”方法?

4

2 回答 2

1

您需要在登录和注销后发送重定向,以让客户端触发新的 HTTP 请求。

例如

public String login() {
    // ...
    return "home?faces-redirect=true";
}

public String logout() {
    // ...
    return "login?faces-redirect=true";
}

顺便说一句,aPhaseListener不是执行基于请求的身份验证的正确工具。您应该更喜欢 servletFilter来完成这项工作。它PhaseListener的主要缺点是它仅在 JSF 请求上运行,并且在每个请求的基础上最多调用 12 次。有关此类过滤器的启动示例,另请参阅如何提供没有 EL 表达式的 bean 方法

于 2012-12-06T11:28:08.293 回答
0

编辑:我应该指出 BalusC 的答案可能应该是解决这个问题的首选方法。但是,如果您仍然想玩相序,请继续阅读。/结束编辑

实际上,如果您将其实现为侦听每个阶段,则可以在您在 action-attribute 中指定的方法之前和之后调用 phaseListeners。

public class MyPhaseListener implements PhaseListener {
    public PhaseId getPhaseId() { return PhaseId.ANY_PHASE; }

    public void beforePhase(PhaseEvent event) {
        System.out.println("Before Phase: " + event.getPhaseId());
    }
    public void afterPhase(PhaseEvent event)  {
        System.out.println("After Phase: " + event.getPhaseId());
    }
}

在 faces-config.xml 中激活你的监听器

<faces-config ... >
    <lifecycle>
        <phase-listener>MyPhaseListener</phase-listener>
    </lifecycle>
</faces-config>

以下是所有 Listener 调用的打印输出以及调用 actionListener 和 action 的时间:

INFO: Before Phase: RESTORE_VIEW 1
INFO: After Phase: RESTORE_VIEW 1
INFO: Before Phase: APPLY_REQUEST_VALUES 2
INFO: After Phase: APPLY_REQUEST_VALUES 2
INFO: Before Phase: PROCESS_VALIDATIONS 3
INFO: After Phase: PROCESS_VALIDATIONS 3
INFO: Before Phase: UPDATE_MODEL_VALUES 4
INFO: After Phase: UPDATE_MODEL_VALUES 4
INFO: Before Phase: INVOKE_APPLICATION 5
INFO: ActionListener Done
INFO: Action Done
INFO: After Phase: INVOKE_APPLICATION 5
INFO: Before Phase: RENDER_RESPONSE 6
INFO: After Phase: RENDER_RESPONSE 6
于 2012-12-06T08:31:43.010 回答