Java 程序不进入while循环
我正在创建一个web应用程序。我的数据库使用netbeans 7.4和MySQL 6.1。我想更改用户的密码。保存在数据库中的密码结构在md5中。因此,我必须首先将用户输入的当前密码转换为md5,并检查数据库是否存在匹配项。现在,我的ChangePassword.jsp中有一个表单结构。表单中有三个字段用于当前、新建和重新键入密码。然后通过一个servlet,我处理这些信息 与数据库的连接很好,我已经能够将当前密码加密到md5中。但是,当我在程序中添加一个Java 程序不进入while循环,java,jdbc,Java,Jdbc,我正在创建一个web应用程序。我的数据库使用netbeans 7.4和MySQL 6.1。我想更改用户的密码。保存在数据库中的密码结构在md5中。因此,我必须首先将用户输入的当前密码转换为md5,并检查数据库是否存在匹配项。现在,我的ChangePassword.jsp中有一个表单结构。表单中有三个字段用于当前、新建和重新键入密码。然后通过一个servlet,我处理这些信息 与数据库的连接很好,我已经能够将当前密码加密到md5中。但是,当我在程序中添加一个while(rs.next())循环来循
while(rs.next())
循环来循环查询的所有结果时,它不起作用。因此它不会转发到所需的jsp。有没有关于我如何做到这一点的建议?任何帮助都将不胜感激。提前谢谢。这是我的密码
try{
ServletContext context = getServletContext();
String currentPassword = request.getParameter("currentPassword");
String newPassword = request.getParameter("newPassword");
String tryNewPassword = request.getParameter("retypePassword");
String pswrd = "";
//For Password Encryption into md5
String md5 = null;
MessageDigest digest = MessageDigest.getInstance("MD5");
digest.update(currentPassword.getBytes(), 0, currentPassword.length());
md5 = new BigInteger(1, digest.digest()).toString(16);
//Database Connection
Class.forName(context.getAttribute("dbdriver").toString());
String db = context.getAttribute("connstr").toString();
Connection conn = DriverManager.getConnection(db);
Statement stmt = conn.createStatement();
stmt = conn.createStatement();
//Check Database Connection
if (conn != null) {
JOptionPane.showMessageDialog(null, "Connected!");
} else {
JOptionPane.showMessageDialog(null, "Not Connected!");
}
String query = "SELECT password FROM accounts WHERE password='"+md5+"'";
ResultSet rs = stmt.executeQuery(query);
JOptionPane.showMessageDialog(null, "Entering while loop");
while(rs.next()){
if(md5CurrentPasswrd.equals(rs.getString(1))){
if(newPassword == tryNewPassword){
digest.update(newPassword.getBytes(), 0, newPassword.length());
md5NewPasswrd = new BigInteger(1, digest.digest()).toString(16);
String queryUpdate = "UPDATE accounts SET password='"+md5NewPasswrd+"' /n"
+ " WHERE password='"+md5CurrentPasswrd+"'";
PreparedStatement prepStmt = conn.prepareStatement(queryUpdate);
prepStmt.executeUpdate();
response.sendRedirect("/Project1/PasswordSaved.jsp");
}else{
response.sendRedirect("/Project1/PasswordNotSaved.jsp");
}
}else{
response.sendRedirect("/Project1/PasswordNotSaved.jsp");
}
pswrd = rs.getString(1);
JOptionPane.showMessageDialog(null, "Running while loop");
}
JOptionPane.showMessageDialog(null, "End of while loop");
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(ChangePassword.class.getName()).log(Level.SEVERE, null, ex);
} catch (ClassNotFoundException ex) {
Logger.getLogger(ChangePassword.class.getName()).log(Level.SEVERE, null, ex);
} catch (SQLException ex) {
Logger.getLogger(ChangePassword.class.getName()).log(Level.SEVERE, null, ex);
}
首先要做的事情是:检查是否有实际的结果需要迭代。如果没有下一步,它就不会进入while循环,这很正常。下一步要做的事情是:停止像那样构建SQL。改为使用参数化SQL,并指定值参数。您使用的是
PreparedStatement
(好),但没有使用它的重要功能(坏)。如果您只关心一点数据库的安全性,请阅读以下内容(编辑:Jon抢先阅读),然后删除行Class.forName(context.getAttribute(“dbdriver”).toString()代码>-这已经十年不需要了。我的建议是,重新编写整个程序。它的代码是这样的:if(newPassword==tryNewPassword){这让那些不得不维护代码的开发人员感到抓狂