如何在用户登录时验证某个电子邮件和密码?
protected void doPost(HttpServletRequest request, HttpServletResponse res) throws IOException, ServletException {
String email=request.getParameter("email");
String pass=request.getParameter("pass");
OutputStream out = res.getOutputStream();
try{
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:8080/college", "root", "root");
Statement st=con.createStatement();
String strSQL = "SELECT email,password FROM student";
如何在SELECT语句后继续?我更希望使用if...else
语句来进行验证。
答案 0 :(得分:2)
首先正确关闭所有连接资源 - 使用Java 7 try-with-resources。
这是一个简单的例子:
final String email = request.getParameter("email");
final String pass = request.getParameter("pass");
try (final Connection con = DriverManager.getConnection("jdbc:mysql://localhost:8080/student", "root", "root");
final PreparedStatement statement = con.prepareStatement("SELECT COUNT(*) AS count FROM student WHERE email=? AND password=?");) {
statement.setString(1, email);
statement.setString(2, pass);
try (final ResultSet resultSet = statement.executeQuery()) {
if (resultSet.next()) {
final int rows = resultSet.getInt("count");
if (rows > 1) {
throw new IllegalStateException("More than one row returned!");
}
boolean validUser = rows == 1;
}
}
}
但实际上你应该在数据库中散列密码。使用jBcrypt之类的内容。您的代码将如下所示:
final String email = request.getParameter("email");
final String pass = request.getParameter("pass");
try (final Connection con = DriverManager.getConnection("jdbc:mysql://localhost:8080/student", "root", "root");
final PreparedStatement statement = con.prepareStatement("SELECT pass FROM student WHERE email=?");) {
statement.setString(1, email);
statement.setString(2, pass);
try (final ResultSet resultSet = statement.executeQuery()) {
if (resultSet.next()) {
final String hash = resultSet.getString("pass");
final boolean valid = BCrypt.checkpw(pass, hash);
}
}
}
显然,如果查询中没有返回任何行,则需要添加错误检查。您还需要检查是否只返回一行。但我把它留作练习。
答案 1 :(得分:0)
答案 2 :(得分:0)
您可以在SQL语句本身中使用电子邮件和密码。像:
SELECT email, password from student where email = ? and password = ?
准备上述语句并绑定参数。
这样验证将在DB上完成,您只需要检查结果计数(必须为1)。您应该在电子邮件列上有索引以获得更好的SQL性能。
答案 3 :(得分:0)
你转发需要取得所有students
吗?
PreparedStatement st = con.prepareStatement("SELECT count(*) FROM student WHERE email=? AND password=?");
st.setString(1, email);
st.setString(2, pass);
ResultSet rs = st.executeQuery();
rs.next();
int count = rs.getInt(1);
if (count == 1) {
// password and email are correct
}
答案 4 :(得分:0)
对于这个答案,我假设通过“验证电子邮件和密码”,您的意思是您希望根据用户的电子邮件地址和密码对用户进行身份验证。而不是您想检查电子邮件地址是否是真实的电子邮件地址。
因此,您需要做的第一件事就是使用哈希算法和随机盐加密数据库中的密码。您可以将哈希密码记录在盐旁边。
接下来的事情是,当用户登录时,您查找该用户的salt,并使用salt执行相同的哈希。然后将其结果与先前保存的密码哈希进行比较,如果它们相同,则密码相同。
重要的是盐对于每个用户来说都是随机的和不同的。
在互联网的上述条款中可以找到大量的阅读材料。
完成后,您还应该在其他答案中应用非常明智的建议,只选择您想要的用户,并正确处理您的资源。
警告我不是安全方面的专家,您也不是。如果您正在为练习实施登录系统,那很好。如果是现实世界,请使用那些知道自己在做什么的人写的东西。