写个登录的页面,调到最后发现从表单获得的密码总是不能和数据库里的密码相等,想不通为什么两个String都是"123456"用equals比较后返回的却是false……我把全部代码都贴出来了,看起来有点长,但不复杂的,求各位大虾指点迷津啊!!
servlet:package servlets;import beans.MessageBean;
import beans.ConnectionBean;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.DriverManager;
import java.io.IOException;
import java.sql.PreparedStatement;
public class Recognize extends HttpServlet{
     public void init(ServletConfig config) throws ServletException{
           super.init(config);
     }
     public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
            String user=request.getParameter("user").trim();
            String password=request.getParameter("password").trim();
            try{
                   byte b[]=user.getBytes("ISO-8859-1");
                   user=new String(b);
            }
            catch(Exception e){
            }
            HttpSession session=request.getSession(true);
            MessageBean messageBean=new MessageBean();
            session.setAttribute("message",messageBean);
            if(checkUser(user,password)){
                  messageBean.setMessage("欢迎"+user+"登录(^o^)/");
                  response.sendRedirect("welcome.jsp");
            }
            else {
                 messageBean.setMessage("用户名或密码错误!请重新登录!");
                 response.sendRedirect("index.jsp");
            }
            
     }
     public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
            doPost(request,response);
     }
     public boolean checkUser(String id,String p){
        try{
            ConnectionBean cb=new ConnectionBean();
            Connection con=cb.getConnection();
            System.out.println("id="+id+"  p="+p);
            PreparedStatement sql=con.prepareStatement("select top 1 password from t_user where userName="+"'"+id+"'");
            //sql.setString(1,id);
            ResultSet rs=sql.executeQuery();
            if(rs.next()){
                  String dbPassword=rs.getString(1);
                  System.out.println(dbPassword);
//=====================================================================
                  System.out.println(dbPassword.equals(p));            //dbPassword.equals(p) 返回的总是false
//=====================================================================
                  if(dbPassword.equals(p)) return true;               
//=====================================================================
                  else return false;
            }
              
            else return false;
           }
        catch(Exception e){  }
        return false;
     }
     
}JSP:<%@ page contentType="text/html; charset=gb2312" language="java" %>
<%@ page import="beans.MessageBean" %><jsp:useBean id="message" class="beans.MessageBean" scope="session" />
<html>
<head>
</head>
<body>
       <center>
              <form action="logmanager" method="post">
                    <label>用户名:</label><input type="text" size="20" name="user" style="width:120"/><br />
                    <label>密 码:</label><input type="password" size="20" name="password" style="width:120"/><br />
                    <input type="submit" value="登 录" name="submit" /> <a href="register.jsp">注册</a>                
              </form> 
              <jsp:getProperty name="message" property="message" />        
       </center>
</body>
</html>JavaBean:package beans;public class MessageBean{
       private String message="";
       public void setMessage(String s){
              message=s;
       }
       public String getMessage(){
              return message;
       }
}
package beans;
import java.sql.Connection;
import java.sql.DriverManager;
public class ConnectionBean{
       Connection con=null;
       public Connection getConnection(){
              try{
                   Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
                   String url="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=db_user";
                   con=DriverManager.getConnection(url,"sa","123456");
              }
              catch(Exception e){
                   e.printStackTrace();    
              }
              return con;
       }
}

解决方案 »

  1.   

    这不可能。
    除非字符串后有空格。
    页面来的字符串你trim了,数据库来的好像没有trim嘛
      

  2.   

    可以啊,代码里有一句String dbPassword=rs.getString(1);打印出的结果是123456,跟数据库里的一样
    我不懂贴图啊!要不就把数据库的截图也发上来
      

  3.   

    equals 方法不会被 你重写了吧 louzhu自己写个函数,比较一下,把你打印出来的两个字符串用equals方法比较下。。               String dbPassword=rs.getString(1);
                      System.out.println(dbPassword);
    上面那个还有temp变量 p 都打印出来,比较一下,用equals方法比较下。。
    看结果是啥
      

  4.   

    byte b[]=user.getBytes("ISO-8859-1");
                       user=new String(b);
    是将字符串加密吗?????
      

  5.   

    System.out.println(dbPassword);
    System.out.println(p);
    System.out.println(dbPassword.equals(p));   
    这样测试一下吧。
    还有你那个sql语句有点问题
    直接select * from user where name = name and password =password 不就行了吗
      

  6.   

    (+﹏+)~悲剧…楼上各位的办法我都试了,equals方法没有被我重写,打印出来的p是123456(123456是我数据库中一个用户的密码),而dbpassword也是123456,可是dbpassword.equals(p)打印出的结果却是false!!!想不通到底是哪里出错!还有那个SQL语句是学视频里的,说是防止什么SQL语句注入漏洞的……
      

  7.   

    你反过来试试用p.equals(dbpassword);再不行的话,你就重新找一个帐号验证一下吧
      

  8.   

    如果你的数据库中,保存用户名和密码的字段是 char 型的 改成 varchar的。
      

  9.   

    嗯。可能是char类型引起的问题。
    你先别纠结于结果了。
    把dbpassword和p的长度都打印出来看看。
    这样就能看出问题了。
      

  10.   

    检查一下,表中的数据用的什么字符集,默认的好像是ISO-8859-1。首先你是用 charset=gb2312,然后容器通过ISO-8859-1转码,最后通过 String password=request.getParameter("password").trim();转为unicode.数据库这边使用ISO-8859-1转为unicode,两个通过equals方法比较,有可能会出现不相等的情况,如果密码是英文字符应该返回是true。最好还是检查下数据库中表的字符集。
      

  11.   

    这样的sql绝对不能写,如果别人在password中填入 ' or ''=' 就会拼出一句绝对返回为true的sql,这就是所谓sql注入漏洞。
      

  12.   

    看看你数据库password的数据类型和用户输入的数据类型是不是相同的,也就是说看看数据库里面密码的数据类型是不是string类型
      

  13.   

    你用的是SQL SERVER 吧?那个里面的字符存的貌似会自动在数据后面加空格至填满上限,所以你从数据库取出密码来以后还是要trim啊,不然就是用“123456”与“123456      ”做比较,当然就出错了
      

  14.   

    发现问题了!!!用length方法测试后,从数据库取出的密码(密码为:123456)的长度是10,而从表单获得的密码的长度是6,这是怎么回是?我已经用trim()把dbPassword的空格去掉了!!数据库是MS的SQLserver2000。还请各位达人再帮我一下!!!
      

  15.   


    用以下代码看一下到底是些什么不可见字符再说吧 for (char c: dbPassword.toCharArray())
    System.out.println(new Integer(c));32是空格,应该可以trim掉的。
    49到54依次是1到6
      

  16.   

    又有奇怪的事发生了……dbPassword打印出了四个32,可是我是使用了trim去空格,怎么空格开没去掉?
    去空格的代码是:dbPassword.trim();而且我还另外做了测试,定义了一个String"123456空格空格空格空格",用strim()后使用length,打印出的长度居然还是10!!!这是怎么回是?晕死……
      

  17.   

    哦,trim的用法dbPassword = dbPassword.trim();只调用不赋值是不改变原字符串的值的。
      

  18.   

    我认为你还是好好改改你的checkUser这个方法吧,我看其他都没有什么问题,就你的那个方法有问题?
      

  19.   

    这个其实是java的一个使用习惯问题,Ruby中如果方法对原对象有修改,可以加!表示的。Java中,得你自己注意方法是否会修改原对象。