Olá pessoal,
seguinte… estou com um probleminha no meu Login do sistema. Pelo que entendi é problema de session do Hibernate.
Segue o código relevante:
DAO: [code]public class PessoaDAO {
private Session session;
private Logger logger = Logger.getLogger(PessoaDAO.class);
public PessoaDAO(Session session) {
logger.info("Construtor" + session);
this.session = session;
}
public boolean isValidLoginAndPassword(String loginEmail, String password){
boolean valid = false;
System.out.println("DAO metodo isValidLoginAndPassword...");
System.out.println("DAO session.isOpen() >>> " + session.isOpen());
Query query = session.createQuery("from Pessoa pessoa where pessoa.loginEmail = :le and pessoa.password = :pw");
query.setString("le", loginEmail);
query.setString("pw", password);
Pessoa pessoa = (Pessoa) query.uniqueResult();
if(pessoa != null){
valid = true;
}
System.out.println("DAO Pessoa >>> " + pessoa);
session.getTransaction().commit();
session.close();
return valid;
}[/code]
MB: [code]public class PessoaFace {
private Pessoa pessoa = new Pessoa();
private String senha;
private String loginEmail;
private String nome;
private Long selectedId;
public String doLogin() throws Exception {
boolean logado = false;
Session session = HibernateUtil.currentSession();
System.out.println("face > metodo doLogin() > session.isOpen() >>> " + session.isOpen());
PessoaDAO pessoaDAO = new PessoaDAO(session);
HttpSession ses = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
HttpServletResponse rp = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
System.out.println("face > loginEmail >>>>>> " + this.loginEmail);
System.out.println("face > senha >>>>>> " + this.senha);
logado = pessoaDAO.isValidLoginAndPassword(this.loginEmail, TransformaStringMD5.md5(senha));
if(logado){
ses.setAttribute("user", logado);
rp.sendRedirect("http://localhost:8080/sistema/principal/principal.faces");
return "toPrincipal";
}else{
ses.setAttribute("user", null);
ses.removeAttribute("user");
rp.sendRedirect("http://localhost:8080/sistema/login/login.faces");
return "toLogin";
}
}[/code]
XHTML: [code]<h:panelGrid columns=“2”>
<h:outputText value=“Login” styleClass=“rotulos” />
<h:inputText id=“login” value="#{pessoaFace.loginEmail}" required=“true” styleClass=“edit” size=“90” style=" width : 150px;"/>
<h:outputLabel for="senha" value="Senha " styleClass="rotulos"/>
<h:inputSecret id="senha" styleClass="edit" validatorMessage="A senha deve ter no mínimo 6 caracteres!" value="#{pessoaFace.senha}" size="60" style=" width : 150px;">
<f:validateLength minimum="6"/>
</h:inputSecret>
<h:commandButton id="botao" value="Entrar" action="#{pessoaFace.doLogin}" />
<h:message for="login"/>
<h:message for="senha"/>
</h:panelGrid>[/code]
Filter: [code]public class AuthFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest rq = (HttpServletRequest) request;
HttpServletResponse rp = (HttpServletResponse) response;
boolean auth = rq.getSession().getAttribute("user") != null;
if (!auth && !rq.getRequestURL().toString().contains("login.jsf")) {
rp.sendRedirect("http://localhost:8080/sistema/pages/principal/principal.jsf");
} else {
try {
chain.doFilter(request, response);
} catch (Exception e) {
System.out.println("Exception no chain.doFilter");
e.printStackTrace();
}
}
}[/code]A saída é a seguinte: [quote]face > metodo doLogin() > session.isOpen() >>> true
INFO - ConstrutorSessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=[] updates=[] deletions=[] collectionCreations=[] collectionRemovals=[] collectionUpdates=[]])
face > loginEmail >>>>>> sergio.lnd.fantin@gmail.com
face > senha >>>>>> 123456
DAO metodo isValidLoginAndPassword…
DAO session.isOpen() >>> true
DAO Pessoa >>> Pessoa Fisica >>> Sérgio Fantin
Exception no chain.doFilter
org.hibernate.SessionException: Session was already closed
at org.hibernate.impl.SessionImpl.close(SessionImpl.java:302)
at br.com.sistema.dao.HibernateUtil.closeCurrentSession(HibernateUtil.java:30)
at br.com.sistema.filter.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:26)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at br.com.sistema.filter.AuthFilter.doFilter(AuthFilter.java:26)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
ERROR - There was a session for this thread already!![/quote]
Valew…