Перенаправление URL не работает на событии preRenderView

Я наконец получил сообщения, передаваемые между страницами, но это не перенаправляет меня на страницу входа пользователя (../../index.xhtml), вместо этого он показывает запрещенную страницу:

public String permission() throws IOException {
    FacesContext context = FacesContext.getCurrentInstance();
    Map<String, Object> sessionMap = context.getExternalContext().getSessionMap();
    String isLog = (String) sessionMap.get("isLogged");

    if(isLog != "TRUE") {

        System.out.println("*** The user has no permission to visit this page. *** ");
        context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Info : ", "Loggez-vous"));
        context.getExternalContext().getFlash().setKeepMessages(true);
        //context.getExternalContext().redirect("../../index.xhtml");
        return "../../index.xhtml?faces-redirect=true";


    } else {
        System.out.println("*** The session is still active. User is logged in. *** ");
    }
    return "../../index.xhtml?faces-redirect=true";
}

Конечно, ограниченная страница имеет это:

<f:event type="preRenderView" listener="#{userloginMB.permission()}"/>

Перенаправление с использованием get external context сделает сообщения потерянными.

2 ответа

Решение

Не обращая внимания на общую проблему проектирования (посмотрите здесь для начала), кажется, что вы перепутали новый JSF 2.2 <f:viewAction> и старый JSF 2.0/2.1 <f:event type="preRenderView"> трюк.

Возвращая результат навигации как String на запрос GET поддерживается только в <f:viewAction>, не в <f:event type="preRenderView">, Для последнего вам нужно ExternalContext#redirect() который вы случайно откомментировали.

Итак, вы должны сделать либо

<f:event type="preRenderView" listener="#{bean.onload}"/>
public void onload() throws IOException {
    // ...
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    ec.redirect(ec.getRequestContextPath() + "/index.xhtml");
}

или же

<f:metadata>
    <f:viewAction action="#{bean.onload}"/>
</f:metadata>
public String onload() {
    // ...
    return "/index.xhtml"; // Note: no need for faces-redirect=true!
}

и не перепутайте их.

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

Смотрите также:

Вам нужно указать абсолютный путь из корневого контекста при использовании Face-Redirect= True.

поэтому ваша строка результата должна выглядеть так:

return "/dir1/dir2/index.xhtml?faces-redirect=true";

если index.xhtml находится в (контекстном корне), то есть в веб-контенте/index.xhtml, используйте следующую строку:

return "/index.xhtml?faces-redirect=true";

если index.xhtml находится в веб-контенте/pages/dir2/index.xhtml, используйте следующую строку:

return "/pages/dir2/index.xhtml?faces-redirect=true";
Другие вопросы по тегам