我在 GlassFish 上使用 JSF 2 和 PrimeFaces 2.1。
我有一个页面,旨在允许人们在遵循回调 URL 后执行操作(例如,作为嵌入在电子邮件中的链接或作为某些外部身份验证或支付服务的回调 URL 参数)。就我而言,我需要重置密码。回调 URL 有一个 token
GET 参数,如下所示:
http://example.com/app/resetPasswordForm.jsf?token=abc123
On page load of resetPasswordForm.jsf
, I need to check if the token is valid and redirect to the main app screen if it's not valid.
My thinking is to have a bean method like:
public String resetPasswordHandler.showResetForm(String token) {
if /* token is valid */ {
return "resetPasswordForm.jsf";
} else {
return "main.jsf";
}
}
但是我怎样才能使该方法在页面加载时被命中呢?
不确定如何继续——欢迎提出建议。
最佳答案
使用 <f:viewAction>
在渲染 View 之前触发 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,那么您可以使用 <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.
}
另请参阅:
关于jsf - 点击 bean 方法并重定向 GET 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7488211/