JPasswordField获取CCV长度始终返回1的问题求助
CCV输入验证始终返回长度1的问题修复
你遇到的问题是:在JOptionPane中集成JLabel与JPasswordField用于输入信用卡CCV(通过密码框隐藏数字),使用if (digits.length() == 3)验证时,即便输入3位数字,digits.length()始终返回1。
原代码
JPasswordField jpf = new JPasswordField(3); JLabel label = new JLabel("Enter Your CCV: "); Box password_box = Box.createHorizontalBox(); password_box.add(label); password_box.add(jpf); int ccv = JOptionPane.showConfirmDialog(this, password_box, "Enter CCV", JOptionPane.OK_CANCEL_OPTION); String digits = Integer.toString(ccv); if (digits.length() == 3) { JOptionPane.showMessageDialog(this, "Payment Successful!"); } else { System.out.println(digits.length()); JOptionPane.showMessageDialog(this, "Invalid CCV!", "Invalid Details!", JOptionPane.ERROR_MESSAGE); }
错误核心
JOptionPane.showConfirmDialog()的返回值是按钮点击状态标识(比如点击OK返回JOptionPane.OK_OPTION对应整数0,点击Cancel返回JOptionPane.CANCEL_OPTION对应整数2),你把这个状态值当成了用户输入的CCV数值,转成字符串后长度自然永远是1,和用户实际输入内容完全无关。
修正后的代码
要获取用户在JPasswordField中输入的内容,需要调用jpf.getPassword()方法(该方法返回char[],是处理密码类输入的安全方式),再进行长度验证:
JPasswordField jpf = new JPasswordField(3); JLabel label = new JLabel("Enter Your CCV: "); Box password_box = Box.createHorizontalBox(); password_box.add(label); password_box.add(jpf); int dialogResult = JOptionPane.showConfirmDialog(this, password_box, "Enter CCV", JOptionPane.OK_CANCEL_OPTION); // 先判断用户是否点击了OK按钮 if (dialogResult == JOptionPane.OK_OPTION) { char[] ccvChars = jpf.getPassword(); String ccvStr = new String(ccvChars); if (ccvStr.length() == 3) { JOptionPane.showMessageDialog(this, "Payment Successful!"); } else { System.out.println(ccvStr.length()); JOptionPane.showMessageDialog(this, "Invalid CCV!", "Invalid Details!", JOptionPane.ERROR_MESSAGE); } // 安全清空密码字符数组,避免敏感数据残留 Arrays.fill(ccvChars, ' '); }
额外提示
- 处理完密码字符数组后,用
Arrays.fill()清空是安全最佳实践,防止敏感数据留在内存中 - 可额外增加正则验证确保输入为纯数字:
ccvStr.matches("\\d{3}")
内容的提问来源于stack exchange,提问作者netbeansnewbie
相关产品推荐
相关产品推荐

