方法
public void beforePhase(PhaseEvent event)
public void afterPhase(PhaseEvent event)
在与
<p:commandButton value="Login" action="#{checkUser.login}" ajax="false" />
当我尝试实现注销功能时,现在必须按两次按钮才能离开页面。
有没有办法在上面提到的“阶段侦听器”方法之前调用“命令按钮”方法?
方法
public void beforePhase(PhaseEvent event)
public void afterPhase(PhaseEvent event)
在与
<p:commandButton value="Login" action="#{checkUser.login}" ajax="false" />
当我尝试实现注销功能时,现在必须按两次按钮才能离开页面。
有没有办法在上面提到的“阶段侦听器”方法之前调用“命令按钮”方法?
您需要在登录和注销后发送重定向,以让客户端触发新的 HTTP 请求。
例如
public String login() {
// ...
return "home?faces-redirect=true";
}
public String logout() {
// ...
return "login?faces-redirect=true";
}
顺便说一句,aPhaseListener
不是执行基于请求的身份验证的正确工具。您应该更喜欢 servletFilter
来完成这项工作。它PhaseListener
的主要缺点是它仅在 JSF 请求上运行,并且在每个请求的基础上最多调用 12 次。有关此类过滤器的启动示例,另请参阅如何提供没有 EL 表达式的 bean 方法
编辑:我应该指出 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