重定向validation

validation.java

try { conn = dsEvent.getConnection(); String userCheck = "select * from customer"; stmt = conn.createStatement(); rs = stmt.executeQuery(userCheck); while(rs.next()){ if((email.equals(rs.getString("email")))&&(password.equals(rs.getString("password")))) { RequestDispatcher rd = req.getRequestDispatcher("/success.jsp"); rd.forward(req,res); } else { req.getSession().setAttribute("error", "The email or password you entered is incorrect. Please try again"); res.sendRedirect(this.getServletContext().getContextPath() + "/index.jsp"); } } } catch (SQLException ex) { System.err.println(ex); } } 

的index.jsp

   

System

Please Login:
Email:
Password:

我正在validation电子邮件和密码。 因此,当用户输入正确的电子邮件和密码时,它将转发到success.jsp。 如果用户输入错误的详细信息,它会将页面重定向到index.jsp以及错误。

但我似乎无法让它在错误的细节部分上工作。它给了我

警告:StandardWrapperValve [com.events.ValidationServlet]:PWC1406:servlet com.events.ValidationServlet的Servlet.service()引发了exception

看起来ResultSet至少包含两行,因此服务器正在执行转发和/或重定向或两者的组合至少两次,这是不允许的,因为您尝试在响应已经关闭时编写响应。

解决方案:将validation代码移到任何循环之外。 确保只在servlet中的方法中调用RequestDispatcher#forwardHttpServletResponse#redirect RequestDispatcher#forward

此外,我不建议在这种情况下使用重定向,因为它会生成新的请求/响应周期,因此存储在请求中的所有属性都不会传递给此新请求/响应。

这主要是对Luiggi Mendoza的回答的补充。 除非在循环中只传递一次,否则不能在循环内部使用forwardsendRedirect 。 正如您所知,servlet会抛出导致错误的exception。

您可以将这些代码移到循环之外:

  boolean found = false; while( (! found) && rs.next()){ if((email.equals(rs.getString("email")))&&(password.equals(rs.getString("password")))) { found = true; } } if (found) { RequestDispatcher rd = req.getRequestDispatcher("/success.jsp"); rd.forward(req,res); } else { req.getSession().setAttribute("error", "The email or password you entered is incorrect. Please try again"); res.sendRedirect(this.getServletContext().getContextPath() + "/index.jsp"); } 

但是在这里你可以手动循环结果集,当你可以让数据库找到匹配时:

  conn = dsEvent.getConnection(); String userCheck = "select count(*) from customer where email = ? and password = ?"; stmt = conn.prepareStatement(); stmt.setString(1, email); stmt.setString(2, password); rs = stmt.executeQuery(userCheck); if (rs.next().getInt(1) > 0) RequestDispatcher rd = req.getRequestDispatcher("/success.jsp"); rd.forward(req,res); } else { req.getSession().setAttribute("error", "The email or password you entered is incorrect. Please try again"); res.sendRedirect(this.getServletContext().getContextPath() + "/index.jsp"); } 

为什么要遍历整个resultset并validation用户是否存在而是尝试更改select查询以检查数据库中是否存在特定用户。

要做到这一点尝试下面的代码

 String email = request.getParameter("email"); String password = request.getParameter("password"); String userCheck = "select * from tableName where username = ? AND password = ?"; PreparedStatement ps = con.prepareStatement(userCheck); ps.setString(1, email); ps.setString(2, password); ResultSet rs = ps.executeQuery(); 

而不仅仅是检查resultset是否为空。

要检查结果集是空的还是不在代码下面:

 if(rs.isBeforeFirst()) { request.getSession().setAttribute("email",email); response.sendRedirect("success.jsp"); } else { request.setAttribute("error", "Invalid Username & Password"); request.getRequestDispatcher("index.jsp").forward(request, response); } 

对于isBeforeFirst()方法,请查看此处 。

还要更改index.jsp以显示错误消息

 

<%=request.getAttribute("error")!=null ? request.getAttribute("error"): "" %>