从密码字段获取文本
您好我正在尝试在java netbeans IDE中创建一个登录表单。 我的目标是创建多个用户ID及其各自的密码。 我已经给userID和passwordField提供了文本字段以获取密码,但问题是我想从密码字段中获取文本而我无法得到它显示一些错误我认为语法存在一些问题我的研究是如下可以有任何解决方案吗? 需要你的帮助
private void lb_loginMouseClicked(java.awt.event.MouseEvent evt) { DBUtil util = new DBUtil(); String value1=tb_uid.getText(); String value2=tb_pwd.getPassword(); String user1=""; String pass1=""; try { Connection con = util.getConnection(); PreparedStatement stmt = con.prepareStatement("SELECT * FROM login where username='"+value1+"' && password='"+value2+"'"); ResultSet res = stmt.executeQuery(); res = stmt.executeQuery(); while (res.next()) { user1 = res.getString("username"); pass1 = res.getString("password"); } if (value1.equals(user1) && value2.equals(pass1)) { JOptionPane.showMessageDialog(this,"correct"); } else{ JOptionPane.showMessageDialog(this,"Incorrect login or password","Error",JOptionPane.ERROR_MESSAGE); } JOptionPane.showMessageDialog(null, "COMMITED SUCCESSFULLY!"); } catch (Exception ex) { JOptionPane.showMessageDialog(null, ex.getMessage()); } }
value2
是char数组,因此执行String
连接将导致数组的String
表示forms,而不是String
内容本身最终在SQL中。 你可以替换
PreparedStatement stmt = con.prepareStatement("SELECT * FROM login where username='"+value1+"' && password='"+value2+"'");
同
PreparedStatement stmt = con.prepareStatement("SELECT * FROM login where username='"+value1+"' AND password='" + new String(value2) + "'");
同样
if (value1.equals(user1) && value2.equals(pass1)) {
需要
if (value1.equals(user1) && pass1.equals(new String(value2)) {
但是,最好使用PreparedStatement
占位符来防止SQL注入攻击:
PreparedStatement stmt = con.prepareStatement("SELECT * FROM login where username=? AND password=?); stmt.setString(1, value1); stmt.setString(2, new String(value2));
注意:这不是一种安全的密码查找方式, 散列比较会相对安全。
String pwd = new String(jPasswordField1.getPassword());
选项1:
jTextField1.setText(""+pwd);
选项2:
System.out.println(""+pwd);
使用此代码:
String password = String.valueOf(jPasswordField.getPassword());
JPasswordField
已加密,但如果使用String.valueOf
,则会将Char转换为String。
来自http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#equals%28java.lang.Object%29 :
等于
public boolean equals(Object anObject)
将此字符串与指定的对象进行比较。 当且仅当参数不为null并且是表示与此对象相同的字符序列的String对象时,结果才为真。
你的代码:
char[] value2=tb_pwd.getPassword(); ... String pass1=""; ... ...&& value2.equals(pass1)...
好像你想要将char数组转换为String然后重试转换。 如果您仍然收到错误,请将其与相关输入一起发布,以便我们可以看到收到的内容。
您想将char[]
转换为String
。 当你调用tb_pwd.getPassword()时,返回一个char [](字符数组)。 如果要比较此密码,必须将其转换为String,为此您可以使用此方法:
String final_pass = ""; for(char x : passwordAsChar[]) { final_pass += x; }
至于比较数据库中的密码,你永远不应该以纯文本,未加密的方式存储它们。 您可以在数据库中存储MD5字符串,并将用户输入的密码转换为String,然后在其上调用以下方法。 然后将返回的String与数据库中的String进行比较。 如果匹配,则用户输入了正确的密码。
例:
char[] pass = tb_pwd.getPassword(); String final_pass = ""; for (char x : pass) { final_pass += x; } String md5_encrypted_pass_userInput = encrypt(final_pass); if (md5_encrypted_pass.equals(pass1)) { /* pass1 = the password from the database */ // Correct password }
用于将字符串加密到MD5的方法是:
public static final String encrypt(String md5) { try { java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5"); byte[] array = md.digest(md5.getBytes()); StringBuffer sb = new StringBuffer(); for (int i = 0; i < array.length; ++i) { sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3)); } return sb.toString(); } catch (java.security.NoSuchAlgorithmException e) {} return null; }