Java 为什么JSP不运行这个“if(s1.equals(s3))”语句,即使条件为true?
我编写了一个程序,其中用户输入用户名和密码,并将其存储到数据库中。但是,第一个ResultSet查询检查用户名输入是否已在数据库中可用,然后在“if”语句中运行代码块,并且不添加用户名输入。否则它会。但在这个程序中,每当用户输入数据时,即使用户输入与数据库中的用户名查询匹配,也会将数据插入浏览器 表格: log.jsp:Java 为什么JSP不运行这个“if(s1.equals(s3))”语句,即使条件为true?,java,jsp,servlets,jdbc,Java,Jsp,Servlets,Jdbc,我编写了一个程序,其中用户输入用户名和密码,并将其存储到数据库中。但是,第一个ResultSet查询检查用户名输入是否已在数据库中可用,然后在“if”语句中运行代码块,并且不添加用户名输入。否则它会。但在这个程序中,每当用户输入数据时,即使用户输入与数据库中的用户名查询匹配,也会将数据插入浏览器 表格: log.jsp: <%@ page import= "java.sql.*" %> <% String s1=request.getParamete
<%@ page import= "java.sql.*" %>
<%
String s1=request.getParameter("user");
String s2=request.getParameter("pass");
Connection con=null;
Statement st=null;
ResultSet rs=null;
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","system","pass");
if (s1.equals("") || s2.equals("")){
out.println("<script>alert('Please Enter valid credentials');</script>");
}
else{
st=con.createStatement();
rs=st.executeQuery("select users from NewUsers");
while(rs.next()){
String s3=rs.getString("users");
if(s1.equals(s3)){
out.println("Username already exists");
}
else{
try{
st.executeUpdate("insert into NewUsers(users,pass) values('"+s1+"','"+s2+"')");
}
catch(SQLException sql){}
finally{
out.println("Signed Up , Go here for login:<a href='login.jsp'>Here</a> ");
}
}
}
}
}
catch(ClassNotFoundException cnfe){}
finally{
if(st!=null)try{st.close();}catch(SQLException ignore){}
if(rs!=null)try{rs.close();}catch(SQLException ignore){}
if(con!=null)try{con.close();}catch(SQLException ignore){}
}
%>
我不明白为什么即使在没有输入任何内容之后,else语句也没有执行?输入中是否有一些默认值
编辑:
我想出来了:
ps=con.prepareStatement("select users from NewUsers u where u.users=?");
ps.setString(1,s1);
rs=ps.executeQuery();
if(rs.next()){
out.println("<script>alert('User already exists')</script>");
}else{//dbUpdate}
你的逻辑完全有缺陷。要检查数据库中是否存在输入的用户,请执行一个从数据库加载所有用户的查询。然后循环遍历所有用户,如果每个用户与输入的用户不同,则插入新用户 那没有道理 使用SQL查询检查数据库中是否存在输入的用户。由于您的下一个错误是使用字符串连接来创建SQL查询,因此请避免犯此错误,并学习使用包含参数的:
select users from NewUsers u where u.users = ?
PS:事实上,您已经犯了这个错误,使您的代码容易受到SQL注入攻击,并且一旦用户名或密码中有一个引号,就无法正常工作。帮个忙,避免在JSP中使用Scriptlet。您有什么建议?我听说了Scriptlet的缺点。请阅读:不。正如我的回答所解释的,通过链接到适当的教程,可以使用预先准备好的语句来完成。感谢您的回复。你能详细说明一下代码是如何导致sql攻击的吗?我是初学者。我将非常感激能得到的任何知识。@chanchalkarn:JB Nizet使用的确切短语——SQL注入攻击——在网络上出现了数十万次。谷歌的第一个热门话题是一篇详细的维基百科文章。请再努力一点,我已经找过了。我指的是这个代码。所以下次我看到这个错误时,我会解决它。
select users from NewUsers u where u.users = ?