Перейдите на внешний URL-адрес с бэк-бина? - PullRequest
4 голосов
/ 21 июля 2010

Я пытаюсь реализовать правильный выход для моего приложения Java EE / JSF2.

Это требует двух вещей:

  1. Мне нужно выйти из JAAS и сделать сеанс недействительным
  2. Затем мне нужно перейти на внешний URL-адрес, чтобы запустить выход из Siteminder

URL-адрес выхода из Siteminder (настроенный на сервере политики -> я не могу его изменить) находится вне контекста моих приложений.Например.если URL моего веб-приложения https://localhost:8080/sm/MyWebApp, то URL-адрес выхода из системы https://localhost:8080/anotherwebapp/logout.html.

Это текущий локальный код выхода из системы:

public void logout() {
    System.out.println("Logging out...");
    HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
    try {
        request.logout();
    } catch (ServletException e) {
        e.printStackTrace();
    }
    HttpSession session = (HttpSession)FacesContext.getCurrentInstance().getExternalContext().getSession(false);
    if (session != null) {
        session.invalidate();
    }
}

А вот свойство, которое создаетURL выхода из системы:

public String getLogoutUrl() {
    HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
    String requestServer = request.getServerName();
    String requestScheme = request.getScheme();
    int serverPort = request.getServerPort();
    String logoutUrl = requestScheme + "://" + requestServer + ":" + Integer.toString(serverPort) + "/anotherwebapp/logout.html";
    return logoutUrl;
}

Однако я не могу найти компонент JSF2 / Primefaces, который может вызвать logout (), а затем открыть внешний URL.Например, если у меня есть:

<h:outputLink value="#{authBean.logoutUrl}" onclick="#{authBean.logout()}">[Logout]</h:outputLink>

, тогда onclick, кажется, не вызывается.

Другой способ, которым я пытался, - поместить внешний URL в конец функции выхода из системы, чтобы он былвозвращается как строка навигации, но она не распознается (также пробуется с помощью «?face-redirect = true» ...).

Любая помощь приветствуется.

Ответы [ 2 ]

13 голосов
/ 22 июля 2010

Вы также можете просто использовать ExternalContext#redirect().

public void logout() throws ServletException, IOException {
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    ((HttpServletRequest) ec.getRequest()).logout();
    ec.invalidateSession();
    ec.redirect("http://example.com/anothercontext/logout");
}

Нет необходимости в промежуточной странице с мета-обновлением.

3 голосов
/ 21 июля 2010

Вы можете создать страницу logout.xhtml, поэтому код будет выглядеть так:

public String getLogoutUrl() {
    return "/logout.jsf";
}

и на странице добавьте:

<META HTTP-EQUIV="Refresh" CONTENT="0;URL=https://localhost:8080/anotherwebapp/logout.html">
...