我正在编写一个用于登录的简单jsp代码,它从mysql中检索数据。代码在response.sendRedirect(“feedback.jsp”);
中显示错误<%@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()” 谢谢。
答案 0 :(得分:1)
首先,连接到数据库的Java代码应该位于servlet内部,而不是JSP内部。 JSP是视图组件。他们不应该全部使用scriptlet。他们唯一的责任应该是用Java编写的控制器存储在请求中的属性生成HTML。
您收到此异常是因为您在将数据发送到响应后尝试重定向。发送重定向包括设置响应头。标题在响应正文之前发送。
此外,您找到用户的策略效率极低。你有用户名。因此,不是从数据库中获取所有用户并将其与您拥有的用户名逐一进行比较,而应该在查询中添加where子句:
select username, password from user where username = ?
阅读Java tutorial about prepared statements。
最后,将密码以明文形式存储在数据库中是一种非常糟糕的做法。应使用强大的加密散列算法对它们进行散列。
答案 1 :(得分:1)
您应该在重定向后返回。
response.sendRedirect("http://www.google.com");
return;
调用sendRedirect().
答案 2 :(得分:0)
这通常是因为您已向客户端发送了响应,并且您正在更改或尝试在将响应发送给用户后发送响应。尝试在重定向语句之前删除任何空格或输出。在这种情况下,我建议在<%
之前删除所有空格,然后尝试执行代码。