Условное перенаправление в JSF
Есть ли встроенный механизм условного перенаправления на другое представление? Я хочу, чтобы пользователь был перенаправлен со страницы входа на "домашнюю страницу", если он/она уже вошли в систему.
У меня уже есть два основных подхода, но для первого я понятия не имею, как достичь, а второй - своего рода грязный обходной путь.
- Добавьте
<meta http-equiv="Refresh" content="0; URL=home.jsf" />
и пусть оно будет отображаться условно (EL: #{login.loggedIn}
)
- Добавьте
<h:panelGroup />
, который также будет условно отображен, содержащий некоторый JavaScript, выполняющий перенаправление.
Есть ли способ достичь 1 или даже другого, более элегантного решения?: -)
Спасибо
Ответы
Ответ 1
Вы можете использовать <f:event type="preRenderView">
.
например.
<f:event type="preRenderView" listener="#{login.checkAlreadyLoggedin}" />
с
public void checkAlreadyLoggedin() throws IOException {
if (isLoggedIn()) {
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
ec.redirect(ec.getRequestContextPath() + "/home.xhtml");
}
}
Ответ 2
Решение, заданное @BalusC, не работает, если представление 'home.xhtml' не является представлением по умолчанию портлета JSF. Для тех, кому необходимо перенаправить на представление, отличное от стандартного, во время фазы рендеринга, я предлагаю решение, изложенное в этой записи. То есть внутри метода preRenderView
выполните следующие действия:
FacesContext fc = FacesContext.getCurrentInstance();
NavigationHandler navigationHandler = fc.getApplication().getNavigationHandler();
navigationHandler.handleNavigation(fc, null, "/views/nonDefaultView.xhtml?faces-redirect=true");
fc.renderResponse();
Кредиты @Frizz1977