消息关闭
    暂无新消息!
使用的是mysql数据库,
public boolean Login(String name,String pwd){
String sql="select * from student where name=? and pwd=?";
psmt=db.getPreparedStatement(sql);
try {
psmt.setString(1, name);
psmt.setString(2, pwd);
ResultSet rs = psmt.executeQuery();
if(rs.next()){
return true;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}

用的是以下的方法判断用户名密码是否正确,但是登录的时候有一个小BUG,表结构中有ID这个属性,如果用户名存在,密码不正确光标也能继续往下移,返回值仍然为true.
例如:我的数据库中有  ID为1,name为2,密码为3,
当我在网站上输入name 2 ,密码为123456 时仍然能够查询到数据,返回为true;
求大神解决一下这个BUG

9个回答

︿ 2
用executeUpdate(sql);这个方法,返回结果的数量,
这是dao层的
public int cheks(UserModel user) {
int row=-1;
//这个就是数据的连接无所谓你用自己的
Connection conn=DBUtil.makeConnection();
     try{
           //这个是查询的sql  ,注意这个sql写的不能换行,我这是格式没办法,你就直接都显示在一行
      String sql ="select * from usertest where userName='"+user.getUserName()+"' and userPassWord='"+user.getUserPassWord()+"'";
st=conn.createStatement();
row=st.executeUpdate(sql);
   } catch (Exception e){
   e.printStackTrace();
   }finally{
   JdbcConn.closeSt(rs, st, conn);
   
   }
return row;
}
,service层的
public boolean checkUsre(UserModel user) {
//检查穿过来的用户名密码
     if((user.getUserName().trim().length()>0 && user.getUserName()!=null) && (user.getUserPassWord().trim().length()>0 && user.getUserPassWord()!=null)){
      UserDaoImpl db =new UserDaoImpl();
//获取到传参的用户名密码个数
//这里cheks()方法就是调用的我上面的dao层的查询方法,到曾操作数据库,service层查询,你在servlet里直接调用service这个方法查询一级一级的
      int number=db.cheks(user);
     if(number>0){
     return true;
     }       
     }  
        return false;  
}
数据库的查询结果number,要大于零,因为你要是没设置非空的话,查询结果就可能是空,但是也能查询,不报错数据库,
所以这里要注意,而且不能先查账户后查密码,那是逻辑错误,那样你会输入你有的用户名,密码也是数据库有的随便数据,只要有而且是,比如test test一组,admin admin一组,你输入test,admin就可以进入,这个也要注意,最需要注意的是数据库用完要关闭,我那finally里是关闭的方法。



自己根据我这个大概自己改一下,这样你能熟悉过程
︿ 2
这个是dao层的代码
	public List<User>  login(User user) {
String userId = user.getUserId();
String password = user.getPassword();
String sql = "select UserName,IsAdmin from t_user  where userId=? and Password=?";
Session session = getSession();
Query query = session.createSQLQuery(sql).setParameter(0, userId).setParameter(1, password).setResultTransformer(Transformers.aliasToBean(entityClass));
List<User> result = query.list();
if(result.size() > 0) {
return result;
}else 
return null;
}


在controller层你判断result是否为null确认是否存在这个用户
︿ 1
public boolean Login(String name,String pwd){
String sql="select * from student where name=? and pwd=?";
psmt=db.getPreparedStatement(sql);
try {
psmt.setString(1, name);
psmt.setString(2, pwd);
ResultSet rs = psmt.executeQuery();
if(rs){
return true;
}else{
return fasle;
} catch (SQLException e) {
// TODO Auto-generated catch block
return false;
e.printStackTrace();
}
}//你的意思是用户存在就返回true不存在就返回false么
给你改了改
︿ 0
这里是 IF 吗?

if(rs.next()){
return true;
}


不应该是while 么

while(rs.next()){
return true;
}
︿ 0
这样写没错啊。怎么可能呢,你把sql拿到数据库里直接查看查出来是什么,然后打印rs.getString(1)和rs.getString(2)看看,应该是哪里传参出问题了
︿ 0
用户验证应该是先通过用户名查出用户的记录,再去对比查出的记录和输入的密码是否一致。