高手们过来集合,准备接分!

SylvanLiu 2008-12-09 07:26:10
也不啰嗦了,进主题吧:

我写了一个GUI的程序,我要说的是登录的问题;
这个程序原来用的是MySQL作后台数据库的,登录用到的是一张users表,里面有这样的两行记录:
name password state
admin 123 unlock
root abc unlock
所有字段都是varchar类型的,name为主键;
登录的时候,数据库连接正常,账号以admin密码以123登录的时候也可以轻松登录;
问题就是:当我以admin为账号,密码以123 登录时(注意:123后面多加了一个空格),居然同样可以登录,理论上是应该不可以的;
然后我试着以root为账号,以abc为密码登录,好,登录正常,当我再以root为账号,以abc 为密码(注意:abc后面多加了一个空格)登录时,
居然同样可以登录!当然,其他的任何情况都是不能登录的,已经测试过N遍了。
之后,我以为是数据类型的问题,就把users表的所有数据都删除了,重新设计了这张表,全都换成了char类型,可是:登录时还是一样的情况!
就是说,连账号后面加了空格(如admin )都可以正常登录,只要密码123不错,后面加多少个空格都可以。
我检查过了,账号和密码在随SQL语句被发送到数据库的前后,都是一样的,都是从文本区获得的字符串,一直都没有变过,就是送到数据库中处理的时候出问题了;
感觉就是查询系统自己把后面的空格去掉了一样!
然后,我干脆换了数据库,改用MS-SQL2000,一样的事情:不管是什么数据类型,char也好,varchar也好,还是nvarchar也好,和上面的情况一模一样!
奇怪的是:我再换Oracle10g数据库的时候,一样的登录方式,Oracle就完全符合理论了!就是:不管账号还是密码,该是什么就是什么,多一个空格就不能登录,要和数据库中的数据完全一样才行!

难道MySQL跟MS-SQL注定就不能做到一次准确无误的验证?只有Oracle才行?各位说说问题的所在,先谢过了
...全文
226 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
dynastytan 2008-12-10
  • 打赏
  • 举报
回复
ORACLE DB很强,接分
时光瞄 2008-12-10
  • 打赏
  • 举报
回复
rs.getString("name").trim()

我以前也有同样的问题,应该是数据库的原因...
VCRWX 2008-12-10
  • 打赏
  • 举报
回复
我们在用时一般要去掉首尾空格,以防止带来不必要的麻烦.数据库是以实际来存取的,我估计问题还是出现在你做字符串的存取上
SylvanLiu 2008-12-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 Looking_Glass 的回复:]
明显是各个数据库对表达式=的逻辑不同!好似MYSQL是不区分大小写,ORACLE,DB2是区分大小写!就这么简单~
如果你要限制,你只能在你登录时限制下!String.trim()应该可以!
[/Quote]
大家对这个怎么看的?我觉得很有道理的;
我的3种数据库形式的登录用的都是同一条语句,MySQL和MS-SQL就自动把空格给去掉了(JTextField和JPasswordField是不会去空格的,可以验证),
但是ORACLE就很精确,是什么字符就是什么字符,多一个空格就别想登录
liuzhengkang 2008-12-10
  • 打赏
  • 举报
回复
呵呵,你少试了一个大小写,不管是大写还是小写都可以登录的
所以最好要加equal()
smujsg 2008-12-10
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 Wing198812 的回复:]
Java code
.....

//处理事件
if(e.getSource() == sureBt){

String name = textName.getText(); //得到的都是""空字符串,而不是null
String passwd = new String(textPassword.getPassword());
boolean pass=this.isPass(name,passwd);
if(pass)
JOptionPane.showMessageDialog(null,"恭喜你,登录成功!","登录成功",JOptionPane.I…
[/Quote]
同意
smujsg 2008-12-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 shigu_java 的回复:]
迷惑,我也遇到过这种情况,怀疑new JTextFild().getText()忽略了尾空格....
[/Quote]
路过....
SylvanLiu 2008-12-10
  • 打赏
  • 举报
回复

.....

//处理事件
if(e.getSource() == sureBt){

String name = textName.getText(); //得到的都是""空字符串,而不是null
String passwd = new String(textPassword.getPassword());
boolean pass=this.isPass(name,passwd);
if(pass)
JOptionPane.showMessageDialog(null,"恭喜你,登录成功!","登录成功",JOptionPane.INFORMATION_MESSAGE);
else{
JOptionPane.showMessageDialog(null,"对不起,帐号或密码错误,请重新输入","信息错误",JOptionPane.WARNING_MESSAGE);
textPassword.setText("");
textName.requestFocusInWindow();
}

}
.....

//isPass方法,判断是否存在合法的账号及密码
public boolean isPass(String name,String passwd){
Connection conn = null;
Statement stmt=null;
String sql=null;
ResultSet rs=null;
boolean pass=false;
try{

//取得一个与MySQL的连接
//public static Connection getMySQLConn(String dbName,String user,String userPassword)是我在外部定义的一个静态方法
conn=DBConnection.getMySQLConn("book","root","123");
stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
sql="SELECT * FROM user WHERE name='"+name+"' AND password='"+passwd+"'";
rs = stmt.executeQuery(sql);
if(rs.next()) pass=true;
}catch (Exception e1) {
e1.printStackTrace();
}finally {
try {
if (stmt != null) stmt.close(); //关闭查询对象
if (rs != null) rs.close(); //关闭保存结果集的对象
if (conn != null) conn.close(); //关闭与数据源的连接
} catch (Exception e2) {
e2.printStackTrace();
}
}

return pass;
}

.....



绝对不是我的语句的问题,因为是同样的语句发生在3种不同的数据库上,结果不一样而已,尤其是Oracle
fuyueyue 2008-12-10
  • 打赏
  • 举报
回复
准备做个类似的,学习下
tz_dzg 2008-12-10
  • 打赏
  • 举报
回复
是数据库的原因,你去查数据库手册,找根源,不是在JAVA上费时间找原因
fulton_xc 2008-12-10
  • 打赏
  • 举报
回复
学习下
zishizhilong 2008-12-10
  • 打赏
  • 举报
回复
路过……
shihp 2008-12-10
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 tz_dzg 的回复:]
是数据库的原因,你去查数据库手册,找根源,不是在JAVA上费时间找原因
[/Quote]
同意
jeezz 2008-12-10
  • 打赏
  • 举报
回复
String.trim()试试
ouyangxiaokang6 2008-12-10
  • 打赏
  • 举报
回复
把空格trim掉
sunwei0325 2008-12-10
  • 打赏
  • 举报
回复
为什么不在登录界面限制禁止输入空格呢?
ssqtjffcu 2008-12-09
  • 打赏
  • 举报
回复

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Test1 {

public static void main(String[] args) throws Exception {
Statement stmt = null;
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql","root","123456");
stmt = conn.createStatement();
//经测试'zeng','zeng ','zeng '查询结果一样
//' zeng','zen g'查不出
String sql = "select Id,name from test where name = 'zeng '";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()) {
System.out.println(rs.getRow()+"----"+rs.getInt(1) +"----"+rs.getString(2));
}
} catch(ClassNotFoundException e) {
e.printStackTrace();
} catch(SQLException e) {
e.printStackTrace();
} finally {
try {
if(stmt != null) {
stmt.close();
stmt = null;
}
if(conn != null) {
conn.close();
conn = null;
}
} catch(SQLException e) {
e.printStackTrace();
}
}
}

}
wqipqkc 2008-12-09
  • 打赏
  • 举报
回复
不是数据库的事.就逻辑判断的问题吧
Looking_Glass 2008-12-09
  • 打赏
  • 举报
回复
明显是各个数据库对表达式=的逻辑不同!好似MYSQL是不区分大小写,ORACLE,DB2是区分大小写!就这么简单~
如果你要限制,你只能在你登录时限制下!String.trim()应该可以!
yulu0214 2008-12-09
  • 打赏
  • 举报
回复
很想知道你的判断语句怎么写的
加载更多回复(8)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧