0

此代码检查登录凭据并在 getParameter(7)=1 时转发到管理员登录页面,或者当它为 0 时转发给客户 .. 如果登录凭据不正确,它将转到错误消息并从她再次登录页面..但不知何故,如果它不是管理员,它会直接进入错误页面!接下来的两个案例根本没有被检查!

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws     ServletException, IOException {
    try
    {
    Class.forName("com.mysql.jdbc.Driver");
    Connection con =      DriverManager.getConnection("jdbc:mysql://localhost:3306/mutualfund", "root", "");
    Statement stmt = con.createStatement();
    ResultSet result = stmt.executeQuery("SELECT * FROM login_table;");
    String uname= request.getParameter("username");
    String pass= request.getParameter("password");

    while(result.next())
    {
        if(result.getString(1).equals(uname) && result.getString(2).equals(pass))
                {
                 if(result.getBoolean(7)==true)
                 {
                       response.sendRedirect("displayFunds.jsp");
                 }
                 if((result.getBoolean(7)==false) && (result.getString(4).equals("")))
                 {
                     response.sendRedirect("changePassword.jsp?name="+uname+"&&pass="+pass);

                 }
                 if((result.getBoolean(7)==false) &&     (!result.getString(4).equals("")))
                 {
                     response.sendRedirect("custProfile.jsp");
                 }
                }
        else 
        {


                response.sendRedirect("loginFailed.jsp");  
        }

    }
    }
    catch (Exception ex) {
        Logger.getLogger(Admin.class.getName()).log(Level.SEVERE, null, ex);
    }

}
}
4

1 回答 1

1

您不是从该方法返回,而是继续遍历 while 循环。您似乎期望一个简单的方法调用会response.sendRedirect()神奇地中止整个 while 循环并从该方法返回。它不这样做。代码只是继续循环,检查下一个用户并设置重定向 URL,从而覆盖前一个。

您需要自己从该方法返回。

response.sendRedirect(someURL);
return;

您的具体问题是由于您的登录名与数据库中的最后一个用户条目不匹配而引起的。


然而,与具体问题无关,这种方法效率极低。您没有利用关系数据库的强大功能,而是将整个 DB 表复制到 Java 的内存中并在 Java 中执行比较。您应该以这样的方式编写 SQL 查询,它可以准确地返回您需要的信息。在这种特殊情况下,您应该改用 SQLWHERE子句(在准备好的语句中!),以便结果集恰好包含零或一行。

if (resultSet.next()) {
    // Login OK!
} else {
    // Login fail!
}

此外,您的代码还通过从不关闭它们来泄漏数据库资源。您应该将它们关闭finally。此外,无需在每个 HTTP 请求上加载 JDBC 驱动程序。只需在 webapp/servlet 启动期间加载一次。

也可以看看:

于 2013-06-12T18:05:08.693 回答