Foros del Web » Programación para mayores de 30 ;) » Java »

No puedo mantener la sesion en jsf

Estas en el tema de No puedo mantener la sesion en jsf en el foro de Java en Foros del Web. Hola a todos, estoy trabajando con hibernate y PrimeFaces, termine un login, que funciona corrrectamente, y me redirecciona al menu de mi sistema, pero cuando ...
  #1 (permalink)  
Antiguo 07/03/2015, 17:07
 
Fecha de Ingreso: diciembre-2014
Ubicación: Lima
Mensajes: 68
Antigüedad: 9 años, 4 meses
Puntos: 0
Exclamación No puedo mantener la sesion en jsf

Hola a todos, estoy trabajando con hibernate y PrimeFaces, termine un login, que funciona corrrectamente, y me redirecciona al menu de mi sistema, pero cuando intento acceder a otra pagina me regresa al login, adjunto mi codigo

pagina XHTML
Código HTML:
Ver original
  1. <html xmlns="http://www.w3.org/1999/xhtml"
  2.     xmlns:ui="http://java.sun.com/jsf/facelets"
  3.     xmlns:h="http://java.sun.com/jsf/html"
  4.     xmlns:f="http://java.sun.com/jsf/core"
  5.     xmlns:p="http://primefaces.org/ui">
  6.    
  7.     <f:loadBundle basename="com.jonathan.msgs.message" var="msgs"/>
  8.  
  9. <h:head>
  10.     <title>#{msgs.titulo_login}</title>
  11.     <link href="#{appBean.baseUrl}resources/css/login.css" type="text/css"
  12.         rel="stylesheet" />
  13. </h:head>
  14. <h:body>
  15.     <div class="conteiner">
  16.         <p:growl id="growl" sticky="true" showDetail="true" life="3000" />     
  17.        
  18.         <h:form id="formLogin">
  19.             <p:panel id="basic" header="Login" style="margin-bottom:20px">
  20.                 <h:panelGrid columns="2" cellpadding="10">
  21.                     <h:panelGrid columns="2" cellpadding="5">
  22.                         <h:outputLabel for="username" value="#{msgs.log_usuario}" />
  23.                         <p:inputText id="usuUsuario" value="#{loginBean.usuario.usuUsuario}" required="true"
  24.                             label="#{msgs.log_usuario}" />
  25.  
  26.                         <h:outputLabel for="password" value="#{msgs.log_password}" />
  27.                         <p:password id="usuPassword" value="#{loginBean.usuario.usuPassword}" required="true"
  28.                             label="#{msgs.log_password}" />
  29.  
  30.                         <f:facet name="footer">
  31.                             <p:commandButton value="#{msgs.log_entrar}" update=":growl"
  32.                                 actionListener="#{loginBean.login(actionEvent)}"
  33.                                 oncomplete="handleLoginRequest(xhr, status, args)" icon="ui-icon-key" />
  34.                         </f:facet>
  35.                     </h:panelGrid>
  36.                 </h:panelGrid>
  37.             </p:panel>
  38.         </h:form>
  39.     </div>
  40.  
  41.     <script type="text/javascript">
  42.         function handleLoginRequest(xhr, status, args) {
  43.             if (args.validationFailed || !args.loggedIn) {
  44.                 jQuery('#formLogin').effect("shake", {times: 5}, 1000);
  45.             }
  46.             else {
  47.                 location.href = args.ruta;
  48.             }
  49.         }
  50.      </script>
  51. </h:body>
  52. </html>

loginBean
Código Java:
Ver original
  1. public void login(ActionEvent actionEvent) {   
  2.         RequestContext context = RequestContext.getCurrentInstance();
  3.         LoginDao loginDao = new LoginDaoImpl();
  4.         boolean loggedIn = false;
  5.         String ruta = "";
  6.         FacesMessage msg = null;
  7.         try {
  8.             this.usuario = loginDao.logear(this.usuario);
  9.             if(usuario != null){
  10.                 loggedIn = true;
  11.                 FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("usuUsuario", this.usuario.getUsuUsuario());
  12.                 msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Bienvenido al sistema", this.usuario.getUsuNombre());
  13.                 ruta = MyUtil.basePathLogin() + "views/inicio.xhtml";
  14.             }
  15.             else{
  16.                 loggedIn = false;
  17.                 msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Error de Logeo", "Usuario y/o Contraseña Incorrectos");
  18.             }
  19.         } catch (Exception e) {
  20.             e.printStackTrace();
  21.         }      
  22.         FacesContext.getCurrentInstance().addMessage(null, msg);
  23.         context.addCallbackParam("loggedIn", loggedIn);
  24.         context.addCallbackParam("ruta", ruta);
  25.  
  26.     }
  27.    
  28.     public boolean verificarSesion(){
  29.         boolean estado;
  30.         if(FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuUsuario") == null){
  31.             estado = false;
  32.         }
  33.         else{
  34.             estado = true;
  35.         }
  36.         return estado;
  37.     }

loginDaoImpl
Código Java:
Ver original
  1. public Usuario logear(Usuario usuario) {
  2.         Session session = HibernateUtil.getSessionFactory().openSession();
  3.         Usuario us = null;
  4.         try {
  5.             session.getTransaction().begin();
  6.             String hql = "from Usuario where usuUsuario = '"
  7.                     + usuario.getUsuUsuario() + "' and usuPassword = '"
  8.                     + Encript_MD5.getStringMessageDigest(usuario.getUsuPassword(), Encript_MD5.MD5) + "'";
  9.             Query query = session.createQuery(hql);
  10.             if (!query.list().isEmpty()) {
  11.                 us = (Usuario) query.list().get(0);
  12.             }
  13.             session.getTransaction().commit();
  14.         } catch (Exception e) {
  15.             System.out.println("No se puede logear " + e.getMessage());
  16.             session.getTransaction().rollback();
  17.         }
  18.         return us;
  19.     }

Hasta aqui me redirecciona a mi pagina principal la cual contiene un template con su respectivo menu, pero al intentar acceder a otra pagina me regresa al login.

Esto coloco en cada pagina xhtml
<h:outputLabel value="USTED NO HA INICIADO SESIÓN" rendered="#{loginBean.verificarSesion() eq false}" />
<h:form rendered="#{loginBean.verificarSesion()}">
</h:form>
  #2 (permalink)  
Antiguo 08/03/2015, 02:36
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: No puedo mantener la sesion en jsf

Buenas,

No conozco nada de JSF pero hay un par de cosas que me llaman la atención.

-No veo que estés accediendo realmente al objeto de sesión del servidor. Estás seguro que con ese FacesContext.getCurrentInstance().getExternalConte xt().getSessionMap() estás accediendo a la sesión?
En JSF debería hacerse así:
HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false );
session.setAttribute(clave, valor)


-Por otro lado, los servicios transversales como el de autorización deberían ser controlados mejor desde un filtro. Aquí tienes un ejemplo de esa aproximación con JSF:
http://javaknowledge.info/authentica...mefaces-3-4-1/


Un saludo
__________________
If to err is human, then programmers are the most human of us
  #3 (permalink)  
Antiguo 09/03/2015, 09:27
 
Fecha de Ingreso: diciembre-2014
Ubicación: Lima
Mensajes: 68
Antigüedad: 9 años, 4 meses
Puntos: 0
Respuesta: No puedo mantener la sesion en jsf

Cita:
Iniciado por Profesor_Falken Ver Mensaje
Buenas,

No conozco nada de JSF pero hay un par de cosas que me llaman la atención.

-No veo que estés accediendo realmente al objeto de sesión del servidor. Estás seguro que con ese FacesContext.getCurrentInstance().getExternalConte xt().getSessionMap() estás accediendo a la sesión?
En JSF debería hacerse así:
HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false );
session.setAttribute(clave, valor)


-Por otro lado, los servicios transversales como el de autorización deberían ser controlados mejor desde un filtro. Aquí tienes un ejemplo de esa aproximación con JSF:
[url]http://javaknowledge.info/authentication-based-secure-login-logout-using-jsf-2-0-and-primefaces-3-4-1/[/url]


Un saludo
Muchas gracias por el link Profesor_Falken, lo revisare bien, yo estoy usando hibernate, y ahora con el tema de alances en bean, pues lei que lo mejor era usar FacesContext.getCurrentInstance().getExternalConte xt().getSessionMap() ,
en vez de Httpsession, probare el ejemplo y cualquier cosa informare por aqui.

Etiquetas: bean, jsf, sesiones
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:14.