当前位置:编程学习 > JAVA >>

紧急求助,我的一个登陆界面不知道哪里出错了

代码如下:

<%@ page language="java" contentType="text/html; charset=gbk"
    pageEncoding="gbk"%>
<%@ page import="java.sql.*" %>
<%
request.setCharacterEncoding("gbk");
String action=request.getParameter("action");
if(action!=null&&action.equals("post")){
String _username=request.getParameter("username");
String _password=request.getParameter("password");


Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost/bbs?user=root&password=root";
Connection conn=DriverManager.getConnection(url);

String sql= "select* from user";
Statement stat=conn.createStatement();
ResultSet rs=stat.executeQuery(sql);


while(rs.next()) {
//System.out.print(_username);
//System.out.println(rs.getString("username"));
if(_username.equals(rs.getString("username"))){
System.out.println("2");
String use=rs.getString("username");
Statement stat1=conn.createStatement();
//今天做东西的时候发现这个错误,查了查,特地记下来,以后开始积累了 哈哈 解决发法是:

//使用rs.getString();前一定要加上rs.next();(如果使用result必须使用next())

//原因:ResultSet对象代表SQL语句执行的结果集,维护指向其当前数据行的光标。每调用一次next()方法,光标向下移动一行。最初它位于第一行之前,因此第一次调用next()应把光标置于第一行上,使它成为当前行。随着每次调用next()将导致光标向下移动一行。在ResultSe对象及其t父辈Statement对象关闭之前,光标一直保持有效。


int id=rs.getInt("id");

 // ResultSet rs1=stat1.executeQuery("select * from user where username='"+_username+"';");
ResultSet rs1=stat1.executeQuery("select * from user where id="+id);
//ResultSet rs1=stat1.executeQuery("select * from user where username="+"_username");
while(rs1.next()){

if(_password.equals(rs1.getString("password"))){

System.out.println(rs1.getString("password"));


System.out.println("1");
response.sendRedirect("ShowArticleTree.jsp");
}
else{
System.out.println("hao2");
response.sendRedirect("Login.jsp");
System.out.print("密码错");}
}
rs1.close();
stat1.close();
}
else{
response.sendRedirect("Login.jsp");
System.out.print("用户名错");
}

}


rs.close();
stat.close();
conn.close();


}
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk" />
<title>登陆</title>
<link href="css/login.css" type="text/css" rel="stylesheet">
</head>
<body >
<form action="Login.jsp" method="post">
<input type="hidden" name="action" value="post">
<table height="100%" cellspacing=0 cellpadding=0 width="100%" bgcolor=#002779 border=0>
  <tr>
    <td align=middle>
      <table cellspacing=0 cellpadding=0 width=468 border=0 >
        <tr><td><img height=23 src="images/login_1.jpg" width=468></td></tr>
        <tr><td><img height=147 src="images/login_2.jpg" width=468></td></tr></table>
      <table cellspacing=0 cellpadding=0 width=468 bgcolor=#ffffff border=0>
        <tr>
          <td width=16><img height=122 src="images/login_3.jpg" width=16></td>
          <td align="left">
            <table border="0" cellpadding="0" cellspacing="0" >
<tr>
<td align="right"> 用户名:<input type="text" name="username" value=""></td>
</tr>
<tr>
<td align="right"> 密码:<input type="text" name="password" value=""></td>
</tr>


<tr>
<td align="center" ><input type="submit" name="submit" value="确定"></td>
</tr>


</table>
</td>
           <td width=16><img height=122 src="images/login_4.jpg" width=16></td></tr></table>
      <table cellspacing=0 cellpadding=0 width=468 border=0>
        <tr><td><img height=16 src="images/login_5.jpg" width=468></td></tr></table></form>

      </body>
</html>


数据库是三个字段: id ,username,password,
我写的这个当数据库有一条记录的时候可以执行,但是两条的时候就出错了呢
java   login --------------------编程问答-------------------- 2条的时候报什么错?? --------------------编程问答-------------------- 你这是由于同时打开了两个 ResultSet,而且是操作的同一个表数据,导致游标出错,具体原因分析看这里:
http://publib.boulder.ibm.com/infocenter/idm/v2r1/index.jsp?topic=/com.ibm.datatools.javatool.runtime.doc/topics/rpdqprfsitmlt.html

你这个后台登录逻辑有点混乱,根本用不着两个查询的,可以按下面这么改:

        String sql= "select* from user where username='" + _username + "' and password='" + _password + "'";
Statement stat=conn.createStatement();
ResultSet rs=stat.executeQuery(sql);
int id = -1;
if (rs.next()) {
id = rs.getInt("id");
}
rs.close();
stat.close();
conn.close();

if (id != -1) {
response.sendRedirect("ShowArticleTree.jsp");
}
else {
response.sendRedirect("Login.jsp");
}


还有,这么拼接SQL查询语句有个很大的问题就是存在SQL注入漏洞,所以最好是通过传参数的方式调用执行SQL语句。
--------------------编程问答-------------------- 不说你这么做是否多做了一些不必要的事情,单就程序来看,你把rs1.close();
stat1.close();放在while(rs1.next())里面,如果有两条数据,你的while每循环一遍,就要执行一遍,当然会出错
补充:Java ,  Java相关
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,