2012-04-02 18 views
7

He estado luchando durante los últimos días con la parte de inicio de sesión de mi aplicación web. Llegué al punto en el que puedo autenticar con éxito a un usuario que usa JDBCRealm en tomcat (leyendo usuarios de una base de datos de servidor sql). Ahora Quiero enviar algún tipo de comentario cuando la cuenta del usuario ha sido bloqueada, o cuando las credenciales son incorrectas, aquí es donde estoy estancado ahora.Cómo usar FacesContext.getCurrentInstance(), devuelve nulo

que quería utilizar esto:

try { 
     request.login(request.getParameter("user"), request.getParameter("pass")); 
    } catch (ServletException se) { 
     FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Wrong Username/Password combination")); 
     log(se.getMessage()); 
    } 

Pero FacesContext.getCurrentInstance() siempre devuelve un valor nulo ..

Después de hacer algunas investigaciones descubrí que la solicitud debe venir de una página ubicada en/se enfrenta para que se llame a FacesServlet y se inicialice FacesContext (al menos eso es lo que entendí).

Así que moví la página de inicio de sesión a una nueva carpeta llamada faces, dentro de la carpeta de páginas web. Pero ahora cada vez que intento llamar a la página login.xhtml, me sale este error:

/login.xhtml Not Found in ExternalContext as a Resource 

y este es el StackTrace:

com.sun.faces.context.FacesFileNotFoundException: /login.xhtml Not Found in ExternalContext as a Resource 
at com.sun.faces.facelets.impl.DefaultFaceletFactory.resolveURL(DefaultFaceletFactory.java:232) 
at com.sun.faces.facelets.impl.DefaultFaceletFactory.resolveURL(DefaultFaceletFactory.java:273) 
at com.sun.faces.facelets.impl.DefaultFaceletFactory.getFacelet(DefaultFaceletFactory.java:201) 
at com.sun.faces.application.view.FaceletViewHandlingStrategy.buildView(FaceletViewHandlingStrategy.java:764) 
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:100) 
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:410) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:304) 
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
at java.lang.Thread.run(Thread.java:619) 

consigo este error incluso cuando entro en la URL directamente en el navegador.

Im usando Netbeans 7.1 con Apache Tomcat 7 (que por cierto es un dolor porque consigo una gran cantidad de PermGen de excepciones de memoria -.-)

Cualquier ayuda sobre cómo solucionar este problema sería muy apreciada .

Respuesta

8

Devolverá null cuando no se encuentre en un bean administrado o cualquier otro artefacto JSF. Por ejemplo, en un servlet simple de vainilla o un filtro de servlet que se ejecuta antes de FacesServlet se ejecuta. El FacesServlet es el que crea el FacesContext y lo coloca como ThreadLocal en la solicitud HTTP actual. Necesita hacer el trabajo de inicio de sesión en un frijol administrado JSF en lugar de la manera habitual. Ese fragmento de código de acceso que tienes allí pertenece a un bean gestionado JSF.

En cuanto a la página de inicio de sesión, no es diferente de cualquier otra página JSF que haya desarrollado alguna vez. ¿O nunca se ha desarrollado con JSF y este es su primer intento de JSF? Bueno, deberías haber sido más explícito sobre esto en tu pregunta también. Deshágase de esa carpeta /faces, simplemente coloque el login.xhtml directamente en el contenido web y asegúrese de que el patrón de URL del FacesServlet en web.xml esté configurado en *.xhtml. Luego puede simplemente abrirlo al http://localhost:8080/yourapp/login.xhtml.

Para aprender mejor JSF, primero revise un libro/tutorial decente y no intente improvisar piezas sueltas que haya encontrado en Internet sin entender realmente qué hacen esas líneas de código. Se supone que debes poder escribirlo/explicarlo tú mismo una vez que realmente lo entiendas. Comience aquí: Our JSF wiki page.

+0

Sí, este es mi primer intento de JSF :) Gracias por su respuesta, no responde mi pregunta. Básicamente, no puedo acceder al FacesContext en cualquier lugar antes de que se ejecute FacesServlet, así que tengo que usar un bean administrado cada vez que me gusta acceder al Fctx. Sobre la parte de aprendizaje, me gusta probar hacer cosas básicas en un idioma antes de comenzar a leer un libro, de esa manera cuando lo estoy leyendo, será más fácil y realmente sabré de qué está hablando el libro . De todos modos, todavía no estoy seguro de por qué no puedo colocar la página dentro de la carpeta/faces? Seguiré tu consejo y cambiaré el patrón del Servlet de Caras. –

Cuestiones relacionadas