Sql server 使用JSP进行用户验证

Sql server 使用JSP进行用户验证,sql-server,jsp,validation,Sql Server,Jsp,Validation,我正在使用HTML和JSP构建一个登录页面。但是每次我得到错误“username-incorrect”,当用户名与表不匹配时,应该显示为SQL server。以下是登录表单页面的代码: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-eq

我正在使用HTML和JSP构建一个登录页面。但是每次我得到错误“username-incorrect”,当用户名与表不匹配时,应该显示为SQL server。以下是登录表单页面的代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Expense System</title>
<link rel="stylesheet" href="style.css" type="text/css">
</head>

<body>

<div class=form>

<form name = login method = post action = "login1.jsp">
Username : <input name = user type = text placeholder = username> <br><br>
Password : <input name = pass type = password placeholder = password><br><br>

<input type = submit value = "Submit">
<input type = button value = "Register">

</form>
</div>
</body>
</html>

费用体系
用户名:

密码:

下面是login1.jsp的代码:

<%@ page language="java" contentType="text/html; charse=UTF-8"
pageEncoding="UTF-8" import="java.sql.*"%>

<% Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); %>

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>login check</title>
</head>
<body>

<% String connectionUrl = "jdbc:sqlserver://localhost:1433;" +
       "databaseName=signin;integratedSecurity=true;";
    Connection con = DriverManager.getConnection(connectionUrl);
    String uname = new String("");
    String upass = new String("");
    ResultSet resultset;
    Statement statement = con.createStatement();
    statement.executeQuery("select username, password from signintable");

    resultset = statement.getResultSet();

    while(resultset.next()){
        uname = resultset.getString("username");
        upass = resultset.getString("password");
    }

if(!request.getParameter("user").equals("")){
if(uname.equals(request.getParameter("user"))){
 if(upass.equals(request.getParameter("pass"))) {%>
 <jsp:forward page="welcome.html"></jsp:forward>

<% }
else {
    out.println("pass incorrect");
}
}
 else {
    out.println("username incorrect");
}
}
else { out.println("user not found!");
}
%>

</body>
</html>

登录检查

您正在将整个数据库表拖到Java内存中,并将每一行的值赋给同一个变量。这些变量最终保存表最后一行的值

这是不对的。您需要准确地选择所需的行。将SQL查询更改为如下所示:

PreparedStatement=con.prepareStatement(“从SigningTable中选择id,其中用户名=?和密码=?”;
statement.setString(1,request.getParameter(“用户”);
语句.setString(2,request.getParameter(“pass”);
resultSet=statement.executeQuery();
if(resultset.next()){
//有效登录!
}否则{
//无效登录!
}


与具体问题无关,在JSP文件中编写Java代码是一项艰巨的任务。我建议你也在这方面努力。了解如何使用。

您正在将整个数据库表拖到Java内存中,并将每一行的值赋给同一个变量。这些变量最终保存表最后一行的值

这是不对的。您需要准确地选择所需的行。将SQL查询更改为如下所示:

PreparedStatement=con.prepareStatement(“从SigningTable中选择id,其中用户名=?和密码=?”;
statement.setString(1,request.getParameter(“用户”);
语句.setString(2,request.getParameter(“pass”);
resultSet=statement.executeQuery();
if(resultset.next()){
//有效登录!
}否则{
//无效登录!
}


与具体问题无关,在JSP文件中编写Java代码是一项艰巨的任务。我建议你也在这方面努力。了解如何使用。

如果您想要详细的视图,只需编写代码即可

if(!request.getParameter("user").equals("")) {
    if(uname.equals(request.getParameter("user"))) {
        if(upass.equals(request.getParameter("pass"))) {
            out.println("found the user name ")
        }
    }
} else {
    out.println("din't find it ");
}

您将观察到,在重复
“din't find it”
短语之后,将出现
“find the user name”

如果您想查看详细信息,只需编写代码即可

if(!request.getParameter("user").equals("")) {
    if(uname.equals(request.getParameter("user"))) {
        if(upass.equals(request.getParameter("pass"))) {
            out.println("found the user name ")
        }
    }
} else {
    out.println("din't find it ");
}

您将注意到,在重复
“din't find it”
短语之后,将出现
“find the user name”

,每次有人登录时将整个表带回来并在应用程序中循环使用它不是一个好主意!您应该使用
WHERE
条件来研究参数化查询,以便只选择感兴趣的特定行(如果存在)并对密码进行散列
字符串upass=新字符串(“”)总是可以避免的,因为您正在创建新的对象,而不是插入那些字符串,这是一种糟糕的做法。只需使用
String uname=“”
String upass=“”
。在本例中,您正在合并这些字符串对象。@MartinSmith我使用WHERE条件,但我能够成功运行我的程序。但我想做的是首先检查用户名,如果它是正确的,然后检查密码。o如何使用WHERE条件进行此操作。谢谢你的建议。我会记住这一点。你不应该显示用户名或密码是否不正确。这使得黑客很容易通过暴力手段猜出有效的用户名和/或密码。您应该只显示组合是否有效。每次有人登录时,将整个表返回并在应用程序中循环使用它不是一个好主意!您应该使用
WHERE
条件来研究参数化查询,以便只选择感兴趣的特定行(如果存在)并对密码进行散列
字符串upass=新字符串(“”)总是可以避免的,因为您正在创建新的对象,而不是插入那些字符串,这是一种糟糕的做法。只需使用
String uname=“”
String upass=“”
。在本例中,您正在合并这些字符串对象。@MartinSmith我使用WHERE条件,但我能够成功运行我的程序。但我想做的是首先检查用户名,如果它是正确的,然后检查密码。o如何使用WHERE条件进行此操作。谢谢你的建议。我会记住这一点。你不应该显示用户名或密码是否不正确。这使得黑客很容易通过暴力手段猜出有效的用户名和/或密码。您应该只显示组合是否有效。谢谢您的建议。但是我很想知道我代码中的问题。你能告诉我问题出在哪里吗?第一段已经解释过了。假设DB返回超过1行。在
循环中,
从每一行获取用户名/密码,并分配给循环外声明的变量。在每次循环迭代中,以前分配的值将被当前行的值覆盖。循环之后,变量保存最后一行的值。您正在对最后一行的值进行比较。不客气。既然你是新来的,请别忘了在答案有助于解决/理解问题的时候标记为已接受。另请参阅,谢谢您的建议。但是我很想知道我代码中的问题。你能告诉我问题出在哪里吗?第一段已经解释过了。假设DB返回超过1行。在
循环中,
从每一行获取用户名/密码,并分配给循环外声明的变量。在每个循环上迭代