我在GlassFish上使用JSF 2和PrimeFaces 2.1。
我有一个页面,旨在允许用户在关注回调网址后执行操作(例如,作为电子邮件中嵌入的链接或某些外部身份验证或支付服务的回调网址参数)。在我的情况下,我需要重置密码。回调网址具有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";
}
}
但是如何让这个方法在页面加载时被点击?
不确定如何处理 - 欢迎提出建议。
答案 0 :(得分:25)
在呈现视图之前使用<f:viewAction>
触发bean方法,只返回导航结果(隐式地将其视为重定向)。
E.g。
<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.
}