Проблема с использованием HttpServletRequest authenticate () в прослушивателе JSF 2.0 preRenderView - PullRequest
2 голосов
/ 10 августа 2011

Я пытаюсь использовать authenticate () в методе прослушивателя preRenderView для условного запуска аутентификации в зависимости от параметров просмотра на странице.Я попытался добавить простой метод:

@Named
@RequestScoped
public class PermissionBean implements java.io.Serializable {
public void preRender() {
System.out.println("IN PRERENDER");

HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
HttpServletResponse response = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
try {
    request.authenticate(response);
} catch (Exception e) { // may throw ServletException or IOException
    e.printStackTrace();
}

}

Сам метод аутентификации не вызывает исключение, он вызывает перенаправление в Login.xhtml, как и ожидалось.Тем не менее, я получаю в своем журнале сервера, я получаю это исключение:

enter code here

INFO: IN PRERENDER
FINEST: GET /Login.xhtml previous[3]
INFO: Exception when handling error trying to reset the response.
java.lang.NullPointerException
at     com.sun.faces.facelets.tag.jsf.core.DeclarativeSystemEventListener.processEvent(EventHandler.java:126)
at javax.faces.component.UIComponent$ComponentSystemEventListenerAdapter.processEvent(UIComponent.java:2508)
at javax.faces.event.SystemEvent.processListener(SystemEvent.java:106)
at com.sun.faces.application.ApplicationImpl.processListeners(ApplicationImpl.java:2129)
at com.sun.faces.application.ApplicationImpl.invokeComponentListenersFor(ApplicationImpl.java:2077)
at com.sun.faces.application.ApplicationImpl.publishEvent(ApplicationImpl.java:286)
at com.sun.faces.application.ApplicationImpl.publishEvent(ApplicationImpl.java:244)
at javax.faces.application.ApplicationWrapper.publishEvent(ApplicationWrapper.java:670)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:108)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)

Таким образом, мой запрос не перенаправлен на Login.xhtml.

Мой вопрос - это то,должен работать в управляемом компоненте JSF или это допустимо только вне жизненного цикла запроса JSF?Я попытался вызвать authenticate () из WebFilter, и он работает как обычно.

Спасибо, Эллен

1 Ответ

0 голосов
/ 10 августа 2011

Вы должны указать JSF не отображать ответ, который первоначально запрашивался, при каждом перенаправлении запроса.Вы можете сделать это, проверив, возвращает ли HttpServletRequest#authenticate() false и затем соответственно вызвать FacesContext#responseComplete().

if (!request.authenticate(response)) {
    FacesContext.getCurrentInstance().responseComplete();
}
...