java 初学者遇到的怪问题 ,请高手解答一下

S1412801460 2011-08-11 08:04:59
很奇怪的问题 : 用MD5加密password后 用占位符(?)设置参数的方式竟然查询不出来了
代码如下(数据库中有表userinfo 字段 loginname(内容admin) 、 password(内容admin加密后的密文,一样的加密方式),部分代码已忽略):
String loginName= "admin";
String password = "admin";

Session session = HibernateSessionFactory.getSession();

//md5加密
MessageDigest md5MD = null;
try {
md5MD = MessageDigest.getInstance("md5");
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
byte[] pwdByte =password.getBytes();
md5MD.update(pwdByte);
byte[] newpwdByte = md5MD.digest();
password = new String(newpwdByte);

Connection conn = session.connection();
PreparedStatement pstmt = null;
try {
String sql = "select * from userinfo where loginname=? and loginpwd=?";
pstmt = conn.prepareStatement(sql);
System.out.println(pstmt);
pstmt.setString(1, loginName);
pstmt.setString(2, password);//为什么这里设置了第二参数就查询不出来了?(这里不用占位符就能查询出来,就是把sql改为sql= "select * from userinfo where loginname=? and loginpwd= '"+password+"'",却能查询出来) ResultSet rs = pstmt.executeQuery();
if(rs.next()) {
System.out.println("pstmt"+rs.getString("loginName"));
}
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

...全文
190 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
S1412801460 2011-08-13
  • 打赏
  • 举报
回复
没人来解决这个问题了吗?
阳明 to life 2011-08-12
  • 打赏
  • 举报
回复
把password贴出来看下
jnhcd 2011-08-12
  • 打赏
  • 举报
回复
用preparedstatement给sql set一些参数,特殊字符什么的都已经转过了吧。。应该不是这个原因,我觉得,

mark
空白-键 2011-08-12
  • 打赏
  • 举报
回复
你有几个?,当然就要设几个值了,除非你?在单引号里面,被当成一个字符串值处理
你那加密出来的password并不是MD5串,你谷歌查下java MD5加密
我没去看Hibernate源代码,但我猜queryObject.setParameter原理应该就是用JDBC的PreparedStatement
S1412801460 2011-08-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zhouyuqwert 的回复:]
System.out.println(pstmt);
这句话你打印出两种方法的对比下有差别么- -,感觉看不出什么问题
[/Quote]打印了是一样的结果
阳明 to life 2011-08-12
  • 打赏
  • 举报
回复
System.out.println(pstmt);
这句话你打印出两种方法的对比下有差别么- -,感觉看不出什么问题
S1412801460 2011-08-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jnhcd 的回复:]
用preparedstatement给sql set一些参数,特殊字符什么的都已经转过了吧。。应该不是这个原因,我觉得,

mark
[/Quote]是啊 我把pstmt.setString(2, password)改为pstmt.setString(2, "!#/)zWェC塉J??") 就能查询出来了 ,也就是说第二个参数是常量就能查询出来("!#/)zWェC塉J??"是admin用MD5加密后的密文)
S1412801460 2011-08-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zhouyuqwert 的回复:]
把password贴出来看下
[/Quote]password = "!#/)zWェC塉J??";
S1412801460 2011-08-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 s1412801460 的回复:]
引用 1 楼 linminqin 的回复:
你打印下加密后的password看看,里面应该也含有"?",还有就是你那个加密后的不是MD5串吧
password里面确实是有“?”(这样为什么不行了) 为什么说“还有就是你那个加密后的不是MD5串吧” 呢
[/Quote]
我又发现用HQL语句时也会出现相同的问题
代码:
String queryString = "from Userinfo as model where model.loginName=:loginName model.password='"+password+"'";
Session session = HibernateSessionFactory.getSession();
Query queryObject = session.createQuery(queryString);
queryObject.setParameter("loginName", loginName);
//queryObject.setParameter("password", password);

这时password 加密后 中有没有“?”应该也影响不到啊

S1412801460 2011-08-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 linminqin 的回复:]
你打印下加密后的password看看,里面应该也含有"?",还有就是你那个加密后的不是MD5串吧
[/Quote]password里面确实是有“?”(这样为什么不行了) 为什么说“还有就是你那个加密后的不是MD5串吧” 呢
空白-键 2011-08-11
  • 打赏
  • 举报
回复
你打印下加密后的password看看,里面应该也含有"?",还有就是你那个加密后的不是MD5串吧

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧