【问题标题】:JPasswordField value and string are not equal, but they appear the sameJPasswordField 值和字符串不相等,但看起来一样
【发布时间】:2016-02-11 03:01:42
【问题描述】:

我知道以前有人问过这个问题,但他们没有使用.equals()。所以我要再问一次,为什么我有两个字符串,但是当我将它们与.equals() 进行比较时,我得到了错误。这两个字符串是 1234(passwordField2.getPassword() 和 String s = bufferedreader.readLine()。)我已经使用 s.toCharArray 来比较它们,同样的事情。我试着把它们都打印出来,我得到了 1234 1234

有人知道为什么会这样吗? 谢谢!

【问题讨论】:

  • 空白?它们的长度相等吗?
  • 第二个好像有多余的空间。修剪后尝试比较它们...passwordField2.getPassword().trim().equals(bufferedReader.readLine().trim());
  • @Todd 我试图这样做,但.trim() 不适用于JPasswordField
  • Not String.equal() 不是相等的字符串。找出原因:调试器,也许。此外,某些对象在“预期方式”中不支持equals(),including Arrays(相当于使用arr1 == arr2)。
  • 哦,呃,是的。返回一个char[]。也许这就是他们不匹配的原因?

标签: java string jpasswordfield


【解决方案1】:

查看JavaDocs,passwordField2.getPassword() 返回char[]。

以下代码应该适合您:

boolean passwordsMatch = bufferedreader.readLine().equals(
    new String(passwordField2.getPassword())
);

此代码的工作原理是将char[] 转换为字符串,然后可以将其与原始String 值进行比较。

编辑:As Alex L. states in his answer、JPasswordField 出于安全目的将密码存储为字符数组。

因此,编写此代码的更好方法可能是:

boolean passwordsMatch = Arrays.equals(
    passwordField2.getPassword(), 
    bufferedreader.readLine().toCharArray()
);

【讨论】:

  • 现在你已经取消了使用 char[] 而不是 String 的安全原因
  • @MadProgrammer 我认为如果我深入研究 Java 中的密码最佳实践,这可能超出了这个问题的范围。如果他们改进答案,我愿意接受任何建议的编辑。
  • 安全永远不会超出范围,正确和专业的做法也不会超出范围
  • 谢谢@TaylorHx!我还注意到bufferedreader.readLine().equals(String.valueOf(passwordField2.getPassword())); 也有效。
【解决方案2】:

结合其他答案和其他几点,这里有几个问题:

第二个密码中有多余的空格。您不应该修剪字符串,否则会忽略前导和尾随空格,这是不好的做法。

此外,当您调用 getPassword() 时,JPasswordFields 将返回 char[](请阅读为什么 here),并且字符数组永远不会等于字符串。解决this 问题的最佳方法(就安全性而言)是将密码存储为字符数组。然后,您可以使用Arrays.equals(arr1, arr2) 来检查密码是否相等。

【讨论】:

    猜你喜欢
    • 2013-07-29
    • 2019-05-20
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 2022-08-16
    • 1970-01-01
    • 2016-05-22
    相关资源
    最近更新 更多