Java 从密码字段获取文本
您好,我正在尝试在JavaNetBeansIDE中创建一个登录表单。我的目标是创建多个用户ID及其各自的密码。我已经给userID和passwordField提供了文本字段以获取密码值,但问题是我想从密码字段获取文本,但我无法获取它显示出一些错误我认为语法有一些问题我的研究如下有什么解决方案吗?需要你的帮助吗Java 从密码字段获取文本,java,Java,您好,我正在尝试在JavaNetBeansIDE中创建一个登录表单。我的目标是创建多个用户ID及其各自的密码。我已经给userID和passwordField提供了文本字段以获取密码值,但问题是我想从密码字段获取文本,但我无法获取它显示出一些错误我认为语法有一些问题我的研究如下有什么解决方案吗?需要你的帮助吗 private void lb_loginMouseClicked(java.awt.event.MouseEvent evt) {
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());
}
}
发件人:
相等于
公共布尔等于(对象anObject)
将此字符串与指定的对象进行比较。如果
并且仅当参数不为null并且是
表示与此对象相同的字符序列
您的代码:
char[] value2=tb_pwd.getPassword();
...
String pass1="";
...
...&& value2.equals(pass1)...
似乎您希望将字符数组转换为字符串,然后重试转换。如果您仍然收到错误,请将其与相关输入一起发布,以便我们可以查看接收到的内容。
value2
是字符数组,因此执行String
连接将导致数组的String
表示,而不是String
内容本身在SQL中结束。你可以代替
PreparedStatement stmt = con.prepareStatement("SELECT * FROM login where username='"+value1+"' && password='"+value2+"'");
与
同样地
if (value1.equals(user1) && value2.equals(pass1)) {
需要
if (value1.equals(user1) && pass1.equals(new String(value2)) {
但是,最好使用PreparedStatement
占位符来防止攻击:
注意:这不是一种安全的密码查找方法,比较会相对安全。您想将
char[]
转换为字符串。当您调用tb_pwd.getPassword()时,将返回一个char[](字符数组)。如果要比较此密码,必须将其转换为字符串,为此,可以使用以下方法:
String final_pass = "";
for(char x : passwordAsChar[]) {
final_pass += x;
}
至于比较数据库中的密码,您永远不应该将它们存储在未加密的纯文本中。您可以在数据库中存储一个MD5字符串,然后将用户输入的密码转换为字符串,然后在其上调用以下方法。然后将返回的字符串与数据库中的字符串进行比较。如果它们匹配,则表示用户输入了正确的密码
例如:
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;
}
公共静态最终字符串加密(字符串md5){
试一试{
java.security.MessageDigest md=java.security.MessageDigest.getInstance(“MD5”);
字节[]数组=md.digest(md5.getBytes());
StringBuffer sb=新的StringBuffer();
对于(int i=0;i
使用以下代码:
String password = String.valueOf(jPasswordField.getPassword());
JPasswordField
是加密的,但是如果使用String.valueOf
它会将字符转换为字符串
String pwd = new String(jPasswordField1.getPassword());
选项1:
jTextField1.setText(""+pwd);
System.out.println(""+pwd);
选项2:
jTextField1.setText(""+pwd);
System.out.println(""+pwd);
获取哪个错误?不要将字符串与SQL语句连接起来;这会使您面临SQL注入攻击。你发布的代码的另一个版本在这方面更好。