Использование навигации в JSF - PullRequest
0 голосов
/ 20 сентября 2011

Каркас: JSF 2.0.

Моя проблема : У меня есть страница с именем login.xhtml. Когда кто-то просматривал эту страницу, он вызывал фильтр, называемый фильтром аутентификации. Фильтр проверит, если пользователь уже вошел в систему, он будет перенаправлен по умолчанию в зависимости от роли пользователя (например: администратор перейдет в «admin / admin.xhtml», студент будет перенаправлен в «user / user.xhtml») .

Мое решение: Использование JSF Navigation

Моя конфигурация:

лица-config.xml

<navigation-rule>
    <from-view-id>*</from-view-id>
    <navigation-case>
        <from-outcome>AD</from-outcome>            
        <to-view-id>/admin/admin.xhtml</to-view-id>
    </navigation-case>
    <navigation-case>
        <from-outcome>US</from-outcome>            
        <to-view-id>/user/user.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>

Перенаправление с использованием навигации:

public static void redirectUsingNavigation(String from, String outCome) {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    facesContext.getApplication().getNavigationHandler().handleNavigation(facesContext, from, outCome);
}

Мой вопрос:

  1. Когда я запускаю redirectUsingNavigation ("*", "AD") или redirectUsingNavigation (null, "AD") , не перенаправляет me на admin.xhtml (я все еще на login.xhtml). Как это исправить?
  2. Какие-либо рамки поддерживают меня по этой проблеме?

1 Ответ

2 голосов
/ 20 сентября 2011

Этот код вообще не перенаправляет. Это просто пересылка запроса. Это просто использование одного и того же объекта запроса для другой целевой страницы). При реальном перенаправлении браузер отправляет новый запрос на указанный заголовок Location. Вы видите, как это изменение отражается обратно в адресной строке браузера.

Вам необходимо либо добавить параметр faces-redirect=true к результату, чтобы инициировать перенаправление (это особенно полезно, если вы используете неявную навигацию вместо подробных случаев навигации):

navigationHandler.handleNavigation(facesContext, from, outCome + "?faces-redirect=true")

Или добавить <redirect/> к случаям навигации, если вы хотите, чтобы они всегда имели место:

<navigation-rule>
    <from-view-id>*</from-view-id>
    <navigation-case>
        <from-outcome>AD</from-outcome>            
        <to-view-id>/admin/admin.xhtml</to-view-id>
        <redirect/>
    </navigation-case>
    <navigation-case>
        <from-outcome>US</from-outcome>            
        <to-view-id>/user/user.xhtml</to-view-id>
        <redirect/>
    </navigation-case>
</navigation-rule>

И последнее, но не менее важное: вам нужно убедиться, что handleNavigation() вызывается до ответа, в противном случае он не будет работать вообще, а журналы вашего сервера будут завалены ошибками IllegalStateException: response already committed , Вы можете использовать <f:event type="preRenderView"> для вызова действия bean-компонента до того, как ответ будет принят.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...