Hey all,

I'm working on redirecting a user to the page they requested after successfully authenticating. To do this I use the ExternalContext.redirect() method to redirect to a URL that is stored in the session when they try and access a page but aren't logged in and are redirected. As I understand the JSF specs, this method should call the FacesContext.responseComplete() method and JSF shouldn't try and do anymore with the response. I also have a navigation rule defined for the case when a user hasn't tried to access something before authenticating so they get directed to a default pre-login page.

It seems that when a user has tried to access a restricted page without authentication the navigation handler is ignoring the call to FacesContext.responseComplete() and trying to do another redirect to the default pre-login page. This results in the following exception (somewhat shortened for brevity):

java.lang.IllegalStateException
at org.apache.coyote.tomcat5.CoyoteResponseFacade.sendRedirect(CoyoteResponseFacade.java:352) at org.apache.myfaces.context.servlet.ServletExternalContextImpl.redirect(ServletExternalContextImpl.java:479) at org.apache.myfaces.application.NavigationHandlerImpl.handleNavigation(NavigationHandlerImpl.java:179) at org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:85)
       at javax.faces.component.UICommand.broadcast(UICommand.java:106)
at javax.faces.component.UIViewRoot._broadcastForPhase(UIViewRoot.java:110) at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:184) at org.apache.myfaces.lifecycle.LifecycleImpl.invokeApplication(LifecycleImpl.java:271) at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:102)
       at javax.faces.webapp.FacesServlet.service(FacesServlet.java:109)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)

Is this a bug in the NavigationHandler implementation? I'm using MyFaces 1.0.9.

I tried returning null from my action handler rather than something matching a rule to try and bypass the NavigationHandler, but that resulted in the following exception (again, shortened for brevity):

java.lang.IllegalStateException: Cannot forward after response has been committed at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:324) at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312) at org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:405) at org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:277) at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:300)
       at javax.faces.webapp.FacesServlet.service(FacesServlet.java:110)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)

Any ideas?

Thanks,
Rich

Reply via email to