登录jsf spring和hibernate错误

登录jsf spring和hibernate错误,spring,hibernate,jsf,jakarta-ee,primefaces,Spring,Hibernate,Jsf,Jakarta Ee,Primefaces,我正在使用jsf、spring和hibernate开发一个登录应用程序。 我有一个问题,我得到无效的密码和用户名,即使我把有效的用户名和密码。我不明白为什么。请帮帮我:) login.xhtml <?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-

我正在使用jsf、spring和hibernate开发一个登录应用程序。 我有一个问题,我得到无效的密码和用户名,即使我把有效的用户名和密码。我不明白为什么。请帮帮我:)

login.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"  
      xmlns:f="http://java.sun.com/jsf/core"  
      xmlns:p="http://primefaces.org/ui"
      xmlns:c="http://xmlns.jcp.org/jsp/jstl/core">
    <h:head>
        <title>Facelet Title</title>
        <link href="http://localhost:8084/jsf/resources/css/login.css" type="text/css" rel="stylesheet"/>
    </h:head>
    <h:body>
        <div class="container">
        <h:form id="formLogin">            

    <p:growl id="growl" sticky="true" showDetail="true" life="3000" />
    <p:panel header="Login">
        <h:panelGrid columns="2" cellpadding="5">
            <h:outputLabel for="username" value="Username:" />
            <p:inputText id="username" value="#{utilisateurBean.utilisateur.username}" required="true" label="username" />

            <h:outputLabel for="password" value="Password:" />
            <p:password id="password" value="#{utilisateurBean.utilisateur.password}" required="true" label="password" />

            <f:facet name="footer">
                <p:commandButton value="Login" update="growl" actionListener="#{utilisateurBean.login(actionEvent)}" 
                                 oncomplete="handleLoginRequest(xhr, status, args)" />
            </f:facet>  
        </h:panelGrid>
    </p:panel>
</h:form>
        </div>
<script type="text/javascript">
    function handleLoginRequest(xhr, status, args) {
        if(args.validationFailed || !args.loggedIn) {
            PF('#formLogin').jq.effect("shake", {times:5}, 100);
        }
        else {
            location.href = args.route;
        }
    }
</script>
    </h:body>
</html>
利用urmetier.java

package model.services;

import java.util.List;
import net.vo.Utilisateur;

public interface UtilisateurMetier {
    public Utilisateur verify(Utilisateur utilisateur);
}
利用urmetierimpl.java

package model.services;

import dao.UtilisateurDao;
import java.util.List;
import javax.faces.context.FacesContext;
import net.vo.Utilisateur;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UtilisateurMetierImpl implements UtilisateurMetier{

    @Autowired
    private UtilisateurDao dao;


    public void setDao(UtilisateurDao dao) {
        this.dao = dao;
    }
    @Override
    public Utilisateur verify(Utilisateur utilisateur)
    {
       return dao.verify(utilisateur);
    }
}
利用Urdao.java

package dao;

import java.util.List;
import net.vo.Utilisateur;

public interface UtilisateurDao {

    public Utilisateur getUtilisateur(Integer id);
    public Utilisateur verify(Utilisateur utilisateur);
}
利用urhibernatedao.java

package dao;

import java.util.List;
import net.vo.Utilisateur;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.springframework.stereotype.Repository;

@Repository
public class UtilisateurHibernateDao implements UtilisateurDao{
    private List<Utilisateur> listeUtilisateurs;
@Override
public Utilisateur getUtilisateur(Integer id) {
   Session session = HibernateUtil.getSession();
   try
   {
       session.beginTransaction();
       Query q = session.createQuery("from Utilisateur as u where u.idUtilisateur=" + id);
       return (Utilisateur) q.uniqueResult();
   }
   finally
   {
       session.close();
   }
}

@Override
public Utilisateur verify(Utilisateur utilisateur) {

    Utilisateur user = this.getUtilisateur(utilisateur.getIdUtilisateur());
    if(user != null)
    {
        if(!utilisateur.getPassword().equals(user.getPassword()))
        {
            user = null;
        }
    }
    return user;
}

}
编辑

 public void login(ActionEvent actionEvent)
    {    
        RequestContext context = RequestContext.getCurrentInstance();
        FacesMessage msg;
        boolean loggedIn;

        this.utilisateur = this.utilisateurMetier.verify(this.utilisateur);
        if (this.utilisateur != null)
        {
            loggedIn = true;
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("utilisateur", this.utilisateur.getUsername());
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Welcome", this.utilisateur.getUsername());
            route ="/jsf/faces/index.xhtml";
            System.out.println(this.utilisateur.getUsername());
        } else {
            loggedIn = false;
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Login Error", "Invalid mot de passe");
             if(this.utilisateur == null)
            {
                this.utilisateur = new Utilisateur();
            }
        }
        FacesContext.getCurrentInstance().addMessage(null, msg);
        context.addCallbackParam("loggedIn", loggedIn);
        context.addCallbackParam("route", route);

    }

使用URHIBERNATEDAO中#验证
您正试图从其id检索用户:

Utilisateur user = this.getUtilisateur(utilisateur.getIdUtilisateur());
但是你只有用户名和密码。我建议创建另一个可以从用户名返回用户的方法:

public Utilisateur getUtilisateurByUsername(String username) {
    Session session = HibernateUtil.getSession();
    try {
        session.beginTransaction();
        Query q = session.createQuery("from Utilisateur as u where u.username=:username")
            .setString("username", username);
        return (Utilisateur) q.uniqueResult();
    }
    finally {
        session.close();
    }
}
并在
验证中使用此方法:

Utilisateur user = this.getUtilisateurByUsername(utilisateur.getUsername());
//rest of the code...


这不是主要问题的一部分,但在IMO中,
verify
方法应该处于服务级别,而不是dao。数据访问对象仅用于检索和更新数据源中的数据,而业务规则应在服务层中。

您的密码是否在数据库中加密或类似的内容?您不应在问题中发布请特定用户帮助我,这在本网站中被认为是错误的。不,密码未加密。我有一个名为Utisusateur的表,它有3个字段:IDUtisusateur、用户名和密码谢谢你,虽然我已经尝试过了,但它不起作用,但现在它很好,为了你对业务层的建议,我会这样做。我有另一个问题,我想,如果我把错误的用户名和密码,能够尝试登录另一个时间,直到你得到一个正确的。我想我是在代码上做的,但它不起作用@路易吉Mendoza@Marina这应该在服务层中进行验证。如果您按用户名搜索用户,但dao返回一个
null
值,那么您已经知道用户名是错误的,因此可以返回正确的消息。不,我不想返回消息,我想要的是当我点击命令时能够再次登录button@Marina问题在于,您将
verify
的结果分配给托管bean中使用的当前
utilizateur-utilizateur
,但当该结果无效时,您返回
null
,则会出现无法到达的目标错误(出现在日志中)。因此,要修复它,只需检查
utisulateur-utisulateur
是否为
null
并为该变量分配一个新值。如果(this.utisulateur==null){this.utisulateur=new-utisulateur();},我会在bean中这样做,但我不知道它不起作用。
public Utilisateur getUtilisateurByUsername(String username) {
    Session session = HibernateUtil.getSession();
    try {
        session.beginTransaction();
        Query q = session.createQuery("from Utilisateur as u where u.username=:username")
            .setString("username", username);
        return (Utilisateur) q.uniqueResult();
    }
    finally {
        session.close();
    }
}
Utilisateur user = this.getUtilisateurByUsername(utilisateur.getUsername());
//rest of the code...