登录jsf spring和hibernate错误
我正在使用jsf、spring和hibernate开发一个登录应用程序。 我有一个问题,我得到无效的密码和用户名,即使我把有效的用户名和密码。我不明白为什么。请帮帮我:) login.xhtml登录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-
<?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...