Validation 登录页面自动重定向到其他情况
此代码应检查登录凭据,并在getParameter(7)=1时转发至管理员登录页面,或在getParameter(7)=0时转发至客户。。 如果登录凭据不正确,它将转到错误消息并再次从她转到登录页面。。但不知何故,如果不是管理员的话,它会直接进入errorpage!!接下来的两个案例根本没有被检查Validation 登录页面自动重定向到其他情况,validation,servlets,redirect,jdbc,login,Validation,Servlets,Redirect,Jdbc,Login,此代码应检查登录凭据,并在getParameter(7)=1时转发至管理员登录页面,或在getParameter(7)=0时转发至客户。。 如果登录凭据不正确,它将转到错误消息并再次从她转到登录页面。。但不知何故,如果不是管理员的话,它会直接进入errorpage!!接下来的两个案例根本没有被检查 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletEx
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);
}
}
}
您不是从方法返回,而是继续迭代while循环。您似乎期望一个简单的方法调用
response.sendRedirect()
神奇地中止整个while循环并从该方法返回。它不会那样做。代码只是继续循环,检查下一个用户并设置重定向URL,从而覆盖上一个用户
您需要自己从该方法返回
response.sendRedirect(someURL);
return;
您的具体问题是由于您的登录与数据库中的最后一个用户条目不匹配而导致的
与具体问题无关,但这种方法效率极低。您没有利用关系数据库的强大功能,而是将整个DB表复制到Java内存中,并在Java中执行比较。编写SQL查询时,应确保它能准确地返回所需的信息。在这种特殊情况下,应该改用SQL
WHERE
子句(在准备好的语句中!),以便结果集正好包含零行或一行
if (resultSet.next()) {
// Login OK!
} else {
// Login fail!
}
此外,您的代码还通过从不关闭DB资源而泄漏了它们。您应该在最后关闭它们。此外,在每个HTTP请求上加载JDBC驱动程序也是不必要的。只需在webapp/servlet启动时加载一次即可
另见:
您应该首先删除“==true”和“==false”代码段。如果某件事是真的,你不需要通过再次与真值进行比较来确保它是真的。谢谢:)将其更改为where子句,是的,我意识到它不必要的迭代!!!。。你能不能再看看登录页面,告诉我如何在3次登录失败的情况下询问安全问题???!只需添加一列,计算给定用户名的失败登录尝试次数。。但是检查我的项目的导师告诉我不要在db中为不成功的尝试添加另一列。。。有什么办法可以进行会话吗?我对会话不熟悉。。当我提到这个问题时,我会把其他问题的链接发给你。。你能看见吗