我写了以下代码:
String username=request.getParameter("username");
System.out.println(""+username);
String password=request.getParameter("password");
System.out.println(""+password);
Connection con=getConnection.getConnectionBuilder();
System.out.println("Inside");
PreparedStatement pstmt=con.prepareStatement("Select password from users where username=? ");
pstmt.setString(1, "username");
ResultSet rs=pstmt.executeQuery();
try
{
System.out.println(""+rs.next());
while(rs.next())
{
String pass=rs.getString(1);
System.out.println(""+pass);
if(pass.equals("password"))
{
out.print("Welcome back"+username);
}
else
{
out.print("Wrong username/password combination");
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
pstmt.close();
con.close();
我的rs.next()
部分总是被评估为false
。怎么会这样发生呢?
答案 0 :(得分:8)
请勿拨打rs.next()
两次:
System.out.println(""+rs.next());
while(rs.next())
每次调用它时都会移动迭代器。
因此,如果您的查询返回一行,则第一个rs.next()
移动迭代器指向该行,但第二个rs.next()
返回false,您永远不会进入while
循环。< / p>
删除System.out.println(""+rs.next());
行应有助于解决您的问题。
此外,您正在搜索名为“username”的用户名,该用户名可能不存在,并将返回的密码与“密码”进行比较,这可能是错误的。
修复所有这些问题会给你这个代码:
pstmt.setString(1, username);
ResultSet rs=pstmt.executeQuery();
try {
while(rs.next()) {
String pass=rs.getString(1);
System.out.println(""+pass);
if(pass.equals(password)) {
out.print("Welcome back"+username);
} else {
out.print("Wrong username/password combination");
}
}
}
catch(Exception e) {
e.printStackTrace();
}
答案 1 :(得分:3)
您正在为字符串&#34;用户名&#34;。
设置用户名尝试使用您的变量:pstmt.setString(1, username);
答案 2 :(得分:0)
你两次调用rs.next()
,每次移动行迭代器。
您可能想要省略有效&#34;吃&#34;的println()
。你的第一个(也是唯一显而易见的)行。
另外,正如@dasblinkenlight在评论中所述 - 不要以明文形式存储密码。只要问Target,Adobe和其他为什么不......
干杯,