我正在开发一个使用servlet,mysql数据库和tomcat的项目。所需的功能之一是用户登录页面。我的用户LoginPage servlet(Nea.Servlets.LoginPage)以格式输入电子邮件和密码,并将其传递给Login servlet(Nea.Servlets.Login)。
Login servlet使用另一个类SQLConnection(Nea.SQLConnection)中的一个函数来查询数据库,并检查是否存在具有该电子邮件和密码的用户(这也是包含所有与SQL相关的函数的类在)。
Login servlet的主要部分:
SQLConnection sqlconnection = new SQLConnection();
String Email = (String)request.getParameter("Email");
String Password = (String)request.getParameter("Password");
if(sqlconnection.checkValidLogin(Email, Password) == false)//If the login details are incorrect:
{
PrintWriter out = response.getWriter();
out.println("<meta http-equiv='refresh' content='3;URL='>");//redirects after 3 seconds
out.println("<p style='color:red;'>Login unsuccessful! Please check your details and try again.</p>");
response.sendRedirect("/NEA/");
}
else//If the login details are correct:
{
PrintWriter out = response.getWriter();
out.println("<meta http-equiv='refresh' content='3;URL=studenthome'>");//redirects after 3 seconds
out.println("<p style='color:green;'>Login successful!</p>");
response.sendRedirect("/NEA/studenthome");
}
SQLConnection.checkValidLogin()的主要查询部分:
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection(url, username, this.password);
System.out.println("Database connected!");
PreparedStatement ps = connection.prepareStatement("SELECT `Email`, `Password` FROM `users` WHERE `Email`=? AND `Password`=?;");//As the emails and passwords stored in the database are hashed, search for the hashed version of the input.
System.out.println(ps);
ps.setString(1, email);
ps.setString(2, hashedPassword);
System.out.println(ps);
ResultSet rs = ps.executeQuery();
returnedEmail=rs.getString(1);
returnedPassword=rs.getString(2);
对于checkValidLogin()中的SQL查询,
当我使用时:
PreparedStatement ps = connection.prepareStatement("SELECT `Email`, `Password` FROM `users` WHERE `Email`=? AND `Password`=?;");
我收到错误:java.sql.SQLException:没有为参数2指定值
另一方面,当我使用时:
PreparedStatement ps = connection.prepareStatement("SELECT `Email`, `Password` FROM `users` WHERE (`Email`=?, `Password`=?);");
我最终收到错误:java.sql.SQLException:操作数应包含1列
我在做什么错了?
编辑:使用第一个PreparedStatement(使用'AND'的那个),我放入了一些虚拟值,并且我可以确认hashedPassword不为NULL,因此问题不在于散列算法。
令人讨厌的是,我得到了一个新错误:Nea.SQLConnection.checkValidLogin():java.sql.SQLException:在结果集开始之前。 我真的不明白为什么我写了这样的结果集错误:
returnedEmail=rs.getString(1);
returnedEmail=rs.getString(2);
如果您有兴趣,这是在设置参数之前和之后输出电子邮件,hashedPassword和ps所得到的Tomcat输出:
email=leg
hashedPassword=c7c8fc91abb8ed76c29a883381b92612dcd8235d6e7ddca8d81f6e87d5fab417
Database connected!
com.mysql.jdbc.JDBC4PreparedStatement@60719c1c: SELECT `Email`, `Password` FROM `users` WHERE `Email`=** NOT SPECIFIED ** AND `Password`=** NOT SPECIFIED **;
com.mysql.jdbc.JDBC4PreparedStatement@60719c1c: SELECT `Email`, `Password` FROM `users` WHERE `Email`='leg' AND `Password`='c7c8fc91abb8ed76c29a883381b92612dcd8235d6e7ddca8d81f6e87d5fab417';