2009-07-22 62 views
5

Una vez que el usuario inicia sesión correctamente en el sistema, el sistema redirigirá al usuario a la página de inicio. Ahora mi problema es que si el usuario hace clic en la página de la cuenta de visualización sin iniciar sesión en el sistema, el sistema redirigirá al usuario a la página de inicio de sesión. si el usuario inicia sesión en el sistema, el sistema redireccionará al usuario a la página de inicio, en este caso, ¿cualquier método puede redirigir al usuario a la página anterior que es la página de la cuenta de visualización en lugar de la página de inicio?Redirección de navegación JSF a la página anterior

He intentado utilizar la sesión

String url = (String)session.getAttribute("url"); 
if(url != null) 
    response.sendRedirect(url); 
else 
    response.sendRedirect("homepage.faces"); 

pongo este código bajo doBtnAction public void() {} si el inicio de sesión de usuario con éxito a continuación, redirigir a la URL. Pero obtuve este error

java.lang.IllegalStateException: Cannot forward after response has been committed 
    com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:322) 
    com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:130) 
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:87) 
    com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200) 
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:117) 
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:198) 

Respuesta

0

No ha descrito ninguna infraestructura que utilice para la autenticación, así que supongo que realiza la autenticación en código propio. Probablemente, el enfoque más simple sería guardar el destino inicial en sesión antes de redireccionar a la página de inicio de sesión, y luego de iniciar sesión correctamente puede verificar este atributo y redireccionar al lugar correcto. Particularmente para JSF puede hacerlo en el método de acción que procesa el inicio de sesión. En realidad, sugeriría utilizar algún marco para la autenticación, por ejemplo, Spring Security, porque hace tales cosas al instante, y será mucho más fácil extender su sistema de seguridad en caso de que necesite algunas características adicionales, aunque necesita una configuración adicional

+0

costura también le permite hacer esto fuera de la caja – mtpettyp

+0

estoy usando JSF y el filtro para comprobar si la sesión es nulo si nula redirigir usuario a la página de inicio de sesión. –

2

No estoy seguro, pero trate de hacer esto a través de ExternalContext instalaciones:

Algo como esto:

ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); 
externalContext.redirect(externalContext.encodeResourceURL(externalContext.getRequestContextPath()+getUrl())); 
-2

usted es demasiado tarde y que le está dando la excepción. Hágalo en un phaselistener antes de la fase de respuesta de renderizado.

+3

Esto no tiene sentido. – BalusC

15

Esta excepción se debe a que llamó a response.sendRedirect() y no impidió que JSF procesara la respuesta normal. Debe informar a JSF que no necesita gestionar la respuesta normal agregando

FacesContext.getCurrentInstance().responseComplete(); 

al método de acción.

O, mejor aún, simplemente no conseguir el HttpServletResponse de debajo de las campanas de la JSF, pero en lugar de hacerlo:

FacesContext.getCurrentInstance().getExternalContext().redirect(url); 

Esto invocará automáticamente responseComplete() y también mantiene su código limpio de cosas Servlet API innecesaria . También vea el ExternalContext API.

+0

¡Amo stackoverflow! Todavía no necesito hacer una pregunta, porque siempre encuentro que la mía ya fue respondida aquí. Gracias BalusC. – Naganalf

+0

Esto no funciona en mi caso: cuando llamo a getAttribute ("url") en HttpSession, obtengo nulo. Intenté llamar a getRequestURI() en HttpServletRequest, pero esto devuelve el URI de la página de inicio de sesión a la que se redirige al usuario si no ha iniciado sesión. – Theo

+0

@Theo: ese es un problema totalmente diferente. Primero debe configurarlo usted mismo :) – BalusC

0

java.lang.IllegalStateException: no puede reenviar después de la respuesta se ha cometido

La excepción es bastante claro:

  • La respuesta ha sido cometido.
  • No puede reenviar después de que se haya confirmado la respuesta.

¿Qué no tiene sentido?

0

La lógica descrita (inicio de sesión-redirección) debe implementarse a través de Mecánica del filtro. También puede probar las reglas de navegación jsf estándar (si puede adaptarse a su caso). Y si aún desea enviar un redireccionamiento a una url personalizada y no desea usar Filtros, hágalo en su servlet en fase de renderizado, no en su bean jsf.

-2

La colocación de la sintaxis a continuación en Web.xml debería funcionar:

<context-param> 
<param-name>com.sun.faces.writeStateAtFormEnd</param-name> 
<param-value>false</param-value> 
</context-param> 
+0

Esta es la solución para una causa ** diferente ** que resulta en una excepción similar (¡pero no igual!). Véase también http://stackoverflow.com/questions/8072311/illegalstateexception-cannot-create-a-session-after-the-response-has-been-commi/8072445#8072445 – BalusC

Cuestiones relacionadas