为什么我的rs.next()的值总是false,可是我的数据库中有数据的!我想实现的功能是验证用户名密码! 括起来更不能,我试过了,这是在servlet中实现,不是worksheet! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 调试出执行的sql,放到数据库中看一下,是sql的问题把 你给出的部分代码应该没有问题,你再帖多些代码,是不是你传入SQL语句的logname和password有问题啊。 在worksheet中用:SELECT * FROM member WHERE logname =‘hu’ AND password =‘hu’;但是在servlet中好像只能用SELECT * FROM member WHERE logname =? AND password =?吧?我用户注册的代码可以正确执行,可以写入数据! package myservlet.control;import mybean.data.*;import java.sql.*;import java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class HandleLogin extends HttpServlet{ public void init(ServletConfig config) throws ServletException { super.init(config); try { Class.forName("oracle.jdbc.driver.OracleDriver"); } catch(Exception e){} } public String handleString(String s) { try{ byte bb[]=s.getBytes("iso-8859-1"); s=new String(bb); } catch(Exception ee){} return s; } public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { Connection con; PreparedStatement sql; Login loginBean=null; String backNews=""; HttpSession session=request.getSession(true); try{ loginBean=(Login)session.getAttribute("login"); if(loginBean==null) { loginBean=new Login(); session.setAttribute("login",loginBean); } } catch(Exception ee) { loginBean=new Login(); session.setAttribute("login",loginBean); } String logname=request.getParameter("logname").trim(), password=request.getParameter("password").trim(); boolean ok=loginBean.getSuccess(); logname=handleString(logname); password=handleString(password); if(ok==true&&logname.equals(loginBean.getLogname())) { backNews=logname+"已经登录了"; loginBean.setBackNews(backNews); } else { String uri="jdbc:oracle:thin:@127.0.0.1:1521:HU"; boolean boo=(logname.length()>0)&&(password.length()>0); try{ con=DriverManager.getConnection(uri,"huyanqiang","hu48934"); String condition="SELECT * FROM member WHERE logname =? AND password =?"; sql=con.prepareStatement(condition); if(boo) { sql.setString(1,logname); sql.setString(2,password); ResultSet rs=sql.executeQuery(); if(rs.next()==true) { backNews="登录成功"; loginBean.setBackNews(backNews); loginBean.setSuccess(true); loginBean.setLogname(logname); } else { backNews="您输入的用户名不存在,或密码不般配+1"+rs; loginBean.setBackNews(backNews); loginBean.setSuccess(false); loginBean.setLogname(logname); loginBean.setPassword(password); } } else { backNews="您输入的用户名不存在,或密码不般配+2"; loginBean.setBackNews(backNews); loginBean.setSuccess(false); loginBean.setLogname(logname); loginBean.setPassword(password); } con.close(); } catch(SQLException exp) { backNews=""+exp; loginBean.setBackNews(backNews); loginBean.setSuccess(false); } } RequestDispatcher dispatcher=request.getRequestDispatcher("showLoginMess.jsp"); dispatcher.forward(request, response); } public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { doPost(request,response); }}全部代码如上! 我看过了,没有乱码!用worksheet可以正常工作,注册功能也可以正常实现! 并不是在servlet中必须用这种形式,而是因为采用这种形式可以避免别人恶意破坏。 你把接受到的用户名和密码在servlet中输出看看是否和你输入的一样,我估计是中文乱码问题 按楼上的说法,我从servlet中输出了,和输入的一样,不是中文乱码问题! if(boo) { sql.setString(1,request.getParameter("logname")); sql.setString(2,request.getParemeter("password")); ResultSet rs=sql.executeQuery(); if(rs.next()==true) { backNews="登录成功"; loginBean.setBackNews(backNews); loginBean.setSuccess(true); loginBean.setLogname(logname); } 我认为是PreparedStatement对象在设置指定的logname和password时,参数的传递出问题了,建议打印这两个参数的值. 我打印出rs的值为:oracle.jdbc.driver.OracleResultSetImpl@9b1670我打印出sql的值为:oracle.jdbc.driver.OraclePreparedStatement@160bf50 我打印出condition的值为:SELECT * FROM member WHERE logname =? AND password =? 好像condition的值不应该是那样的?怎么办?哪里错了! 是要打印request.getParameter("logname")和request.getParameter("password"); 我那个肯定是对的,现在我发现sql.setString(1,logname); sql.setString(2,password); 这两句好像不起作用! 我觉的if(rs.next()) { backNews="登录成功"; loginBean.setBackNews(backNews); loginBean.setSuccess(true); loginBean.setLogname(logname); 你在这里用的是if它只是判断你取出来的第一个对象符不符合你的要求,不符合就就进入了else,你把if(rs.next())换成while(rs.next())试试看 我就是只用第一个对象判断啊,可是我 if(boo) { sql.setString(1,logname); sql.setString(2,password); ResultSet rs=sql.executeQuery(); String a=rs.getString("logname"); if(rs.next()) { backNews="登录成功"; loginBean.setBackNews(backNews); loginBean.setSuccess(true); loginBean.setLogname(logname); } else { backNews="您输入的用户名不存在,或密码不般配+1"+a; loginBean.setBackNews(backNews); loginBean.setSuccess(false); loginBean.setLogname(logname); loginBean.setPassword(password); }编译时说我没有使用next()方法;当我这样写时: if(boo) { sql.setString(1,logname); sql.setString(2,password); ResultSet rs=sql.executeQuery(); boolean b=rs.next(); String a=rs.getString("logname"); if(b==true) { backNews="登录成功"; loginBean.setBackNews(backNews); loginBean.setSuccess(true); loginBean.setLogname(logname); } else { backNews="您输入的用户名不存在,或密码不般配+1"+a; loginBean.setBackNews(backNews); loginBean.setSuccess(false); loginBean.setLogname(logname); loginBean.setPassword(password); }又提示说:用尽的 Resultset 把你表结构贴出来,我认为你是在sql.setString(1,logname); sql.setString(2,password); 出的问题,表的字段和你设置的索引没有对应上. logname password email 就这三个字段! 你的代码是没有问题的啊,估计是sql查询的问题啊,你先在sql命令中查询一下,看用这个语句能否查出啊,要不还有可能就是字符串编码的问题啊 我用worksheet查询可以查出来! 我看了一下你的代码,没看出来问题,呵呵 。 你可以试下插入一个英文的logname,password,试下看看能不能查出来 换用String condition="SELECT * FROM member WHERE logname ='"+logName+"' AND password ='"+passWord+"'"; 看能不能出来!!! 这两句不是没有起作用,因为在servlet中输出的condition也是只进行初始化的sql语句,你在servlet里追踪也好,javabean里追踪也好,都只能输出只进行了初始化的sql 我觉得是sql的问题。回头我瞧瞧 先写个固定的sql看看能不能把数据查出来 另外说一下楼主这个sql有漏洞,比如对方传入帐号密码均为'or''='rs.next() 一定要拿出来rs.getString("user").equals(user)取出来的职一定要和传入的值比较下是不是一个. 如果你不闲麻烦的话 加我QQ357382027 把代码给我 我帮你调调看看什么原因额 算了公司不让上QQMSN:[email protected] 不闲麻烦就加我给你解决 先打印出来你的name 和password 我怀疑是你的name 和password的问题 比如 是乱码 你错了,使用占位符是不会发生sql注入的漏洞的 楼主你最好把你logname和password打印出来看一下 排除乱码:全用英文的账号和密码sql问题:在查询呢分析器上运行下代码 输出查询前后的username,password 看看是什么 建议你将SQL语句打印出来,然后复制到查询分析器中运行,再看结果;要不就是你的数据库中的数据有问题,如:字段值中存在空格 package com.chris.test.servlet;import java.io.IOException;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class MyServletTest extends HttpServlet{ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String logname=req.getParameter("name"); String password=req.getParameter("password"); String backNews; try{ Class.forName("oracle.jdbc.driver.OracleDriver"); Connection con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:8000:DEV", "test", "test"); PreparedStatement pstm=null; String condition="SELECT * FROM member WHERE logname =? AND password =?"; pstm=con.prepareStatement(condition); pstm.setString(1,logname); pstm.setString(2,password); ResultSet rs=pstm.executeQuery(); if(rs.next()) { backNews="登录成功"; } else { backNews="您输入的用户名不存在,或密码不般配+1"+rs; } System.out.println(backNews); }catch(Exception e){ throw new ServletException(e); } } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req,resp); } }我访问这个Servlet就是好的。LZ试试http://localhost:8000/servlet/com.chris.test.servlet.MyServletTest?name=chris&password=123456 你数据库插入数据后别忘记commit password=request.getParameter("password").trim(); password 在哪定义的? 呵呵 这只是个小问题另外 你看看你数据库中的数据左右有没有空格? 对,这个非常有可能,看看你的是varchar类型的,还是char类型的。最好设为varchar类型的 Tomcat 虚拟站点 跑Struts时,二级目录下的Action无法响应 及时通信效果 为什么我的打印语句不能执行????? rs.next()返回值的奇怪问题? struts2.18问题 jsp的初学问题?(在线等待中) javabeans求救! Bean文件放在什么地方? 请问各位大虾,如何使用jsp页面里的butten触发调用bean或者servlet??? java项目访问时遇到的问题,用ip访问时有的方法访问不到 求 :jsp 网站新闻管理系统 后台 原代码 网站的收费方式有哪些
是sql的问题把
但是在servlet中好像只能用SELECT * FROM member WHERE logname =? AND password =?吧?
我用户注册的代码可以正确执行,可以写入数据!
import mybean.data.*;
import java.sql.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HandleLogin extends HttpServlet
{ public void init(ServletConfig config) throws ServletException
{ super.init(config);
try { Class.forName("oracle.jdbc.driver.OracleDriver");
}
catch(Exception e){}
}
public String handleString(String s)
{ try{ byte bb[]=s.getBytes("iso-8859-1");
s=new String(bb);
}
catch(Exception ee){}
return s;
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException
{ Connection con;
PreparedStatement sql;
Login loginBean=null;
String backNews="";
HttpSession session=request.getSession(true);
try{ loginBean=(Login)session.getAttribute("login");
if(loginBean==null)
{ loginBean=new Login();
session.setAttribute("login",loginBean);
}
}
catch(Exception ee)
{ loginBean=new Login();
session.setAttribute("login",loginBean);
}
String logname=request.getParameter("logname").trim(),
password=request.getParameter("password").trim();
boolean ok=loginBean.getSuccess();
logname=handleString(logname);
password=handleString(password);
if(ok==true&&logname.equals(loginBean.getLogname()))
{ backNews=logname+"已经登录了";
loginBean.setBackNews(backNews);
}
else
{ String uri="jdbc:oracle:thin:@127.0.0.1:1521:HU";
boolean boo=(logname.length()>0)&&(password.length()>0);
try{ con=DriverManager.getConnection(uri,"huyanqiang","hu48934");
String condition="SELECT * FROM member WHERE logname =? AND password =?";
sql=con.prepareStatement(condition);
if(boo)
{ sql.setString(1,logname);
sql.setString(2,password);
ResultSet rs=sql.executeQuery();
if(rs.next()==true)
{ backNews="登录成功";
loginBean.setBackNews(backNews);
loginBean.setSuccess(true);
loginBean.setLogname(logname);
}
else
{ backNews="您输入的用户名不存在,或密码不般配+1"+rs;
loginBean.setBackNews(backNews);
loginBean.setSuccess(false);
loginBean.setLogname(logname);
loginBean.setPassword(password);
}
}
else
{ backNews="您输入的用户名不存在,或密码不般配+2";
loginBean.setBackNews(backNews);
loginBean.setSuccess(false);
loginBean.setLogname(logname);
loginBean.setPassword(password);
}
con.close();
}
catch(SQLException exp)
{ backNews=""+exp;
loginBean.setBackNews(backNews);
loginBean.setSuccess(false);
}
}
RequestDispatcher dispatcher=request.getRequestDispatcher("showLoginMess.jsp");
dispatcher.forward(request, response);
}
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException
{ doPost(request,response);
}
}
全部代码如上!
sql.setString(1,request.getParameter("logname"));
sql.setString(2,request.getParemeter("password"));
ResultSet rs=sql.executeQuery();
if(rs.next()==true) {
backNews="登录成功";
loginBean.setBackNews(backNews);
loginBean.setSuccess(true);
loginBean.setLogname(logname);
}
我认为是PreparedStatement对象在设置指定的logname和password时,参数的传递出问题了,建议打印这两个参数的值.
我打印出sql的值为:oracle.jdbc.driver.OraclePreparedStatement@160bf50
我那个肯定是对的,现在我发现sql.setString(1,logname);
sql.setString(2,password);
这两句好像不起作用!
{ backNews="登录成功";
loginBean.setBackNews(backNews);
loginBean.setSuccess(true);
loginBean.setLogname(logname);
你在这里用的是if它只是判断你取出来的第一个对象符不符合你的要求,不符合就就进入了else,你把if(rs.next())
换成while(rs.next())试试看
if(boo)
{ sql.setString(1,logname);
sql.setString(2,password);
ResultSet rs=sql.executeQuery();
String a=rs.getString("logname");
if(rs.next())
{ backNews="登录成功";
loginBean.setBackNews(backNews);
loginBean.setSuccess(true);
loginBean.setLogname(logname);
}
else
{ backNews="您输入的用户名不存在,或密码不般配+1"+a;
loginBean.setBackNews(backNews);
loginBean.setSuccess(false);
loginBean.setLogname(logname);
loginBean.setPassword(password);
}
编译时说我没有使用next()方法;当我这样写时: if(boo)
{ sql.setString(1,logname);
sql.setString(2,password);
ResultSet rs=sql.executeQuery();
boolean b=rs.next();
String a=rs.getString("logname");
if(b==true)
{ backNews="登录成功";
loginBean.setBackNews(backNews);
loginBean.setSuccess(true);
loginBean.setLogname(logname);
}
else
{ backNews="您输入的用户名不存在,或密码不般配+1"+a;
loginBean.setBackNews(backNews);
loginBean.setSuccess(false);
loginBean.setLogname(logname);
loginBean.setPassword(password);
}
又提示说:用尽的 Resultset
sql.setString(1,logname);
sql.setString(2,password);
出的问题,表的字段和你设置的索引没有对应上.
你可以试下插入一个英文的logname,password,试下看看能不能查出来
看能不能出来!!!
'or''='rs.next() 一定要拿出来
rs.getString("user").equals(user)
取出来的职一定要和传入的值比较下是不是一个.
MSN:[email protected] 不闲麻烦就加我给你解决
你错了,使用占位符是不会发生sql注入的漏洞的
sql问题:在查询呢分析器上运行下代码
package com.chris.test.servlet;import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class MyServletTest extends HttpServlet{ protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String logname=req.getParameter("name");
String password=req.getParameter("password");
String backNews;
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:8000:DEV", "test", "test");
PreparedStatement pstm=null;
String condition="SELECT * FROM member WHERE logname =? AND password =?";
pstm=con.prepareStatement(condition);
pstm.setString(1,logname);
pstm.setString(2,password);
ResultSet rs=pstm.executeQuery();
if(rs.next())
{ backNews="登录成功";
}
else
{ backNews="您输入的用户名不存在,或密码不般配+1"+rs;
}
System.out.println(backNews);
}catch(Exception e){
throw new ServletException(e);
}
} protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req,resp);
}
}
我访问这个Servlet就是好的。
LZ试试http://localhost:8000/servlet/com.chris.test.servlet.MyServletTest?name=chris&password=123456
另外 你看看你数据库中的数据左右有没有空格?