logout commandLink выводит пользователя из системы, но не обновляет страницу - PullRequest
0 голосов
/ 27 июня 2011

В моем приложении JSF есть ссылка для выхода из системы, которая делает недействительным сеанс для выхода пользователя из системы. Это работает, но не перенаправляет пользователя на страницу входа. Он остается на той же странице. Если я снова пытаюсь получить доступ к той же странице, она возвращается к входу в систему. Я хочу, чтобы это произошло немедленно.

ссылка для выхода:

<h:form>
    <h:panelGroup id="loginout">
        <h:outputText value="#{todoController.loggedInUser}" />
        <h:commandLink value="logout" action="#{todoController.logout}" />
    </h:panelGroup>         
</h:form>

код выхода из системы:

public String logout()
{
    System.out.println("testing logout");
    FacesContext fc = FacesContext.getCurrentInstance();
    ExternalContext ec = fc.getExternalContext();

    final HttpServletRequest r = (HttpServletRequest)ec.getRequest();
    r.getSession( false ).invalidate();

    return "../login.html?faces-redirect=true";
}

1 Ответ

6 голосов
/ 27 июня 2011

Это может произойти, если результат неверен.login.html не кажется страницей JSF, поэтому навигация JSF просто не удастся.

Вместо этого вы хотите использовать ExternalContext#redirect().

public void logout() throws IOException {
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    ec.invalidateSession();
    ec.redirect("../login.html");
}

Обратите внимание, что вышеприведенное также демонстрирует более JSF-иш способ аннулировать сеанс.Всякий раз, когда вам нужно вытащить необработанный javax.servlet.* API из-под колпаков JSF, вы всегда должны спрашивать себя дважды: «Неужели действительно не предоставлен API для этого JSF?»

...