我正在编写一个简单的JSP代码,用于登录,该代码从MySQL检索数据。该代码在响应时显示错误。
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%
String user=request.getParameter("username");
String passwrd=request.getParameter("password");
try{
Class.forName("com.mysql.jdbc.Driver");
java.sql.Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/feedback", "root", "");
Statement st=con.createStatement();
ResultSet rs=st.executeQuery("select username,password from users");
while(rs.next())
{
String username=rs.getString(1);
String password=rs.getString(2);
if(user.equals(username) && passwrd.equals(password))
{
response.sendRedirect("feedback.jsp");
}
else
{
out.println("Invalid Credentials");
}
}
}
catch(NumberFormatException e){
System.out.print(e);
e.printStackTrace();
}
%>
如果输入不正确的用户名和密码组合,"无效凭据"的Else语句正常工作,那么与数据库的连接正在起作用。我遇到的错误是"响应后无法调用sendredirect()"谢谢。
- 如果URL绝对是http://www.google.com,则将其重定向到http://www.google.com。
- 如果URL不是绝对的,则重定向 相对于当前URL。如果URL以/重定向开头 相对于上下文根,否则它将其重定向到当前的URL
您应该在重定向后返回。
response.sendRedirect("http://www.google.com");
return;
拨打sendRedirect().
首先,连接到数据库的Java代码应在Servlet内,而不是在JSP内部。JSP是视图组件。他们根本不应该使用脚本。他们唯一的责任应该是从java编写的控制器中存储的属性中生成HTML。
您会得到此异常,因为您已经在将数据发送到响应后尝试重定向。发送重定向在于设置响应标头。并且标题是在响应主体之前发送的。
此外,您找到用户的策略效率极低。您有用户名。因此,与其从数据库中获取所有用户,并将它们一个一个一个一个与您的用户与所拥有的用户名进行比较,而应在查询中添加一个条款:
select username, password from user where username = ?
阅读有关准备陈述的Java教程。
最后,将密码存储在数据库中的清晰文本中是一种非常糟糕的做法。它们应该使用强的加密哈希算法进行哈希。
这通常是因为您已将响应发送给客户端,并且在发送给用户后正在更改或尝试发送响应。在重定向语句之前,请尝试删除任何空间或输出。在这种情况下,我建议在<%
之前删除所有白空间,然后尝试执行您的代码。