Проблема перенаправления JSF2

У меня есть страница входа и страница панели инструментов.

Как только процесс входа в систему завершится, отобразится страница панели инструментов (с использованием правила навигации).

  <navigation-rule>
        <from-view-id>/login.xhtml</from-view-id>
        <navigation-case>
            <from-outcome>dashboard</from-outcome>
            <to-view-id>/viewp/dashboard.xhtml</to-view-id>
        </navigation-case>
    </navigation-rule>

У меня есть сопоставление фильтров для всех запросов.

Вот мой сценарий. На моей странице панели инструментов есть средство опроса на стороне клиента. Когда сервер перезагружается, поллер отправляет запрос, который будет интерпретирован фильтром.

Внутри фильтра у меня есть логика вроде

If(url.contains("login.xhtml))
{
//dofilter
}else
{
// redirect to login.
}

но почему-то это не перенаправление.

У меня есть одно наблюдение: после входа в систему, даже если я нахожусь на странице панели инструментов, мой URL-адрес по-прежнему похож на mydomain/login.xhtml. Я думаю, поскольку URL-адрес в браузере mydomain/login.xhtml, response.redirect("mydomain/login.xhtml") не работает. Какие-либо предложения?

Спасибо,


person kosa    schedule 06.06.2012    source источник


Ответы (1)


Поллер выполняется JavaScript/Ajax, верно? Что ж, вы должны проверить в JavaScript/Ajax, вернул ли сервер 302 вместо 200, и обработать соответственно. Сам браузер не делает этого автоматически для возвращаемых ответов JavaScript/Ajax, а только для ответов на синхронные запросы.

Вы можете использовать window.location в JavaScript для выполнения «перенаправления». Например.

if (ajaxResponseStatus == 302) {
    window.location = newURL;
}
person BalusC    schedule 06.06.2012
comment
Вместо ответа сервера я пытаюсь сделать следующее: когда сервер работает и опросчик отправляет запрос, он проходит через фильтр, внутри фильтра я могу узнать, что это первый запрос, поэтому делаю send.redirect(). Но проблема в том, что URL-адрес, который я передаю здесь, точно такой же, как у меня уже есть в браузере, я думаю, поэтому браузер ничего не делает. - person kosa; 07.06.2012
comment
Вы сейчас говорите, что проводите синхронный опрос? Ваш вопрос/проблема имеет смысл только в том случае, если вы делаете это асинхронно (т.е. с помощью JavaScript/Ajax). - person BalusC; 07.06.2012
comment
В любом случае, когда мы переходим от login.xhtml к dashboard.xhtml, мы можем изменить URL-адрес браузера на основе правила навигации, как в моем вопросе? Я также пробовал /viewp/dashboard.xhtml?faces-redirect=true. - person kosa; 07.06.2012
comment
Это a4j:poll, так что это асинхронный вызов. - person kosa; 07.06.2012
comment
Что ж, тогда просто позвольте его функции обратного вызова обрабатывать перенаправление (если этот компонент поддерживает это). - person BalusC; 07.06.2012
comment
хм, функция обратного вызова a4j:poll? Я не думаю, что есть что-то доступное для этого. Дай мне проверить. - person kosa; 07.06.2012
comment
Почему, когда выполняется правило навигации и отображается панель инструментов, URL-адрес по-прежнему отображается только как login.xhtml? Есть идеи? - person kosa; 07.06.2012
comment
Потому что это перенаправление, а не перенаправление. Добавьте к нему <redirect/>. Но это не ваша конкретная проблема, верно? - person BalusC; 07.06.2012
comment
Я думаю, что это решает проблему. Поскольку поток такой, 1) введите URL-адрес для входа в браузер 2) Фильтр проверяет, входит ли он в систему или нет, если вход продолжается, в противном случае проверяется сеанс и другая переменная, связанная с зарегистрированным пользователем, если они существуют, процесс продолжается 3) Если сеанс является брендом новый, но не логин, он перенаправляет на логин. Теперь я ввел действительные учетные данные, вошел в панель управления. a4j: код опроса находится на странице панели инструментов. Он продолжает выполнение с определенным интервалом, и теперь URL-адрес браузера будет login.xhtml. - person kosa; 07.06.2012
comment
Внезапно предположим, что сервер не работает. Когда a4j:poller продолжает опрос, когда сервер включен, следующий запрос a4j:poller будет обработан фильтром (помните, что URL-адрес в браузере - login.xhtml). Основываясь на третьем условии в комментарии выше, теперь фильтр перенаправляется на login.xhtml, а последующий вызов выполняет первое условие в комментарии выше, но страница по-прежнему отображает только страницу панели инструментов, страница входа не отображается. В этом проблема. Но я предполагаю, что это потому, что браузер уже имеет login.xhtml в URL-адресе, поэтому перенаправление игнорируется. Я тоже могу ошибаться. Что ты посоветуешь? - person kosa; 07.06.2012
comment
Из-за моего предположения, что браузер игнорирует response.redirect() из-за того, что оба URL-адреса одинаковы, я чувствую, что ‹redirect/› в правиле навигации может решить проблему. Я попробую это, как только я войду завтра утром. - person kosa; 07.06.2012
comment
Это не будет. <a4j:poll> не реагирует на перенаправленные ответы. Это ваша конкретная проблема. - person BalusC; 07.06.2012
comment
Ах! В самом деле? Тогда я в большом беспорядке. Что еще мы могли бы сделать здесь? - person kosa; 07.06.2012
comment
Если все, что нужно сделать опросчику, это вызвать этот фильтр (и, следовательно, никаких артефактов/компонентов JSF), вы могли бы с таким же успехом использовать $.get() jQuery, который выполняется setInterval(). В обратном вызове $.get() просто проверьте код состояния ответа. - person BalusC; 07.06.2012
comment
Ok. Позвольте мне попробовать это, как только я войду утром. Спасибо за ваше время на этой теме BalusC. - person kosa; 07.06.2012