Подтвердить что ты не робот

Условное перенаправление в JSF

Есть ли встроенный механизм условного перенаправления на другое представление? Я хочу, чтобы пользователь был перенаправлен со страницы входа на "домашнюю страницу", если он/она уже вошли в систему.

У меня уже есть два основных подхода, но для первого я понятия не имею, как достичь, а второй - своего рода грязный обходной путь.

  • Добавьте <meta http-equiv="Refresh" content="0; URL=home.jsf" /> и пусть оно будет отображаться условно (EL: #{login.loggedIn})
  • Добавьте <h:panelGroup />, который также будет условно отображен, содержащий некоторый JavaScript, выполняющий перенаправление.

Есть ли способ достичь 1 или даже другого, более элегантного решения?: -)

Спасибо

4b9b3361

Ответ 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