Ответ 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, вы можете использовать обходной путь <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.
}