variable - validate session jsf
¿Cómo obtengo y configuro un objeto en el ámbito de sesión en JSF? (3)
Cuando llama al método FacesContext.getCurrentInstance()
, devolverá el subproceso actual, pero en el caso de PSVM no habrá subprocesos ejecutándose en el contexto de la aplicación. Así que obtienes un NPE.
Mejor usar algo como esto:
public String checker() {
SessionFactory factory = HibernateUtil.getSessionFactory();
Session session = factory.getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("from UserLogin where UserId=''"
+ uid.getUserId() + "''and Pswd=''" + uid.getPswd()
+ "''and RoleId=''" + uid.getRoleId() + "''");
setUid((UserLogin) q.uniqueResult());
System.out.println("upto here every thing is workind properly");
if (uid != null) {
FacesContext context = FacesContext.getCurrentInstance();
HttpServletRequestrequest = (HttpServletRequest) context
.getExternalContext().getRequest();
HttpSession appsession = request.getSession(true);
if (appsession.isNew() == false) {
appsession.invalidate();
appsession = request.getSession(true);
}
context.getExternalContext().getSessionMap().put("userbean", uid);
session.close();
return uid.getRoleId();
} else
return "invalid";
}
y ponerlo en un bean sesión. Puedes usar el código para validar usuarios.
Necesito persistir solo un objeto en el alcance de la sesión de mi aplicación JSF. ¿Dónde defino una variable de sesión y cómo obtengo y configuro desde un archivo de vista o un bean de respaldo?
Simplemente moviéndose a lo largo de JSF 2.2 y CDI 1.2 - La inyección será al menos más simple. Mantenerse en línea con la respuesta original de @BalusC:
import javax.enterprise.context.RequestScoped;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.inject.Named;
@Named
@RequestScoped
public class RequestBean {
@Inject
private SessionBean sessionBean;
// ...
@PostConstruct
void init() {
// Interact with sessionBean during construction
// but after Injection.
}
}
con
import java.io.Serializable;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;
@Named
@SessionScoped
public class SessionBean implements Serializable {
private SomeObject someVariable;
// ...
}
Se deben hacer varias notas importantes, especialmente el cambio a @Named
, y el nombre del paquete RequestScoped
para RequestScoped
y SessionScoped
. También para hacer una SessionScoped
clase, también debe ser Serializable
.
La adición de @Inject
hace realmente simple, pero entiendo que el objeto sessionBean
inyectado solo está disponible después de la construcción, no durante. Esto significa que no tiene acceso a sessionBean
dentro del constructor de RequestBean
. Esto se resuelve mediante el uso de @PostConstruct
que se activa después de que se completa la inyección, y, RequestBean
lo demás, RequestBean
está completamente inicializado.
Varias maneras:
Utilice
ExternalContext#getSessionMap()
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); Map<String, Object> sessionMap = externalContext.getSessionMap(); sessionMap.put("somekey", yourVariable);
Y luego más tarde:
SomeObject yourVariable = (SomeObject) sessionMap.get("somekey");
O bien, conviértalo en una propiedad de un bean de ámbito de sesión que inyecte en su bean de ámbito de solicitud.
sessionBean.setSomeVariable(yourVariable);
Y luego más tarde:
SomeObject yourVariable = sessionBean.getSomeVariable();
La inyección de beans entre sí puede ocurrir por
faces-config.xml
como se describe here o si ya está en JSF 2.0, por@ManagedProperty
@ManagedBean @RequestScoped public class RequestBean { @ManagedProperty("#{sessionBean}") private SessionBean sessionBean; // ... }
con
@ManagedBean @SessionScoped public class SessionBean { private SomeObject someVariable; // ... }