2011-12-21 106 views
1

我正在使用HTML和JSP构建登录页面。但每次我得到错误“用户名不正确”,当用户名与表不匹配时,应显示为SQL服务器。下面是登录表单页面的代码:使用JSP进行用户验证

<%@ 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> 
+0

每次有人登录时,将应用程序的整个表格循环回来并不是一个好主意!您应该调查具有WHERE条件的参数化查询,以选择特定的感兴趣的行(如果存在并散列密码)。 – 2011-12-21 20:11:27

+0

在Java中使用类似'String uname = new String(“”);'和'String upass = new String(“”);'的语句总是可以避免的,因为您创建的是新对象而不是实习那些字符串一个不好的做法。只需使用String uname =“”和'String upass =“”'。在这种情况下,你正在汇集这些字符串对象。 – Lion 2011-12-21 20:15:41

+0

@MartinSmith我使用WHERE条件,但我能够成功地运行我的程序。但是我想要做的是首先检查用户名,如果它是正确的,那么检查密码。如何使用WHERE条件来做到这一点。谢谢。 – 2011-12-21 20:22:24

回答

2

你拖了整个数据库表到Java的内存和分配的值每一行都是同一个变量。这些变量最终保持表格的最后一行的值。

这是不对的。您需要选择,确切地说,您需要的行是。您的SQL查询更改为类似如下:

PreparedStatement statement = con.prepareStatement("select id from signintable where username=? and password=?"); 
statement.setString(1, request.getParameter("user")); 
statement.setString(2, request.getParameter("pass")); 
resultSet = statement.executeQuery(); 

if (resultset.next()) { 
    // Valid login! 
} else { 
    // Invalid login! 
} 

无关的具体问题,编写JSP文件中的Java代码是poor practice。我建议你也要努力。了解如何使用servlets

+0

感谢您的建议。但我很想知道我的代码中的问题。你能告诉我有什么问题吗? – 2011-12-21 20:42:22

+0

这在第一段中有解释。想象一下DB返回多于1行。在'while'循环中,你可以从每一行获得用户名/密码,并分配给一个在循环外声明的变量。在每次循环迭代中,先前分配的值都是**用当前行的值覆盖**。循环之后,变量保存* last *行的值。你正在比较* last *行的值。 – BalusC 2011-12-21 21:00:31

+0

哦,是的。我非常愚蠢的错误。谢啦。 – 2011-12-21 21:07:42

-1

如果你想有一个详细视图,与您的代码,只写

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 "句话会有"found the user name "