Я использую фазовый приемник для управления такими вещами, как вход в систему и область разговора. В некоторых ситуациях я хочу перенаправить. Наиболее очевидным является случай, когда пользователь не вошел в систему и пытается получить доступ к защищенной странице.
В настоящее время мой PhaseListener работает после представления восстановления. Это иногда слишком поздно. Когда пользователь выходит из системы, страница удаляется и перенаправляется обратно на страницу входа. Это удаление страницы вызывает некоторые события AJAX в IceFaces - только я уничтожил сессию, поэтому бины не имеют состояния. Это вызывает исключения во время представления восстановления, которое, по-видимому, обращается к компоненту поддержки через EL на странице.
Если я перевожу свой слушатель фазы в представление «Перед восстановлением» и попытаюсь перенаправить с использованием ExternalContext, я получаю исключение NullPointerException.
java.lang.NullPointerException
com.sun.faces.lifecycle.RestoreViewPhase.notifyAfter(RestoreViewPhase.java:301)
com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:114)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:67)
com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:118)
Одним из вариантов, который я мог бы использовать, было бы использование фильтра Servlet для этой работы. Он также будет охватывать запросы не из JSF. Я не знаю, сколько JSF будет доступно (и сколько мне на самом деле нужно) в этом случае, и не сразу понятно, как я могу заставить свой фильтр произойти после таких вещей, как ConversationPropagationFilter и перед PrettyFilter.
Спасибо
- Ричард