Java实现密码强度计分功能运行结果与预期不符如何解决
密码强度检测工具问题修复
错误原因
- 长度计分逻辑不符合需求:仅判断长度≥8加1分,未区分8-12位得1分、大于12位得2分的规则
- 数字检测逻辑错误:内层循环匹配到数字后仅跳出数字遍历的内层循环,外层仍在遍历密码所有字符,密码有多少个数字就会加多少分,而非符合条件仅加1分
- 特殊符号检测逻辑存在同数字检测一样的问题,匹配到符号后未直接终止外层遍历,多符号场景会重复加分
修复方案
按规则调整长度计分逻辑,数字、特殊符号检测匹配到符合要求的字符后直接终止外层遍历,保证对应项仅加1分。
修复后的核心point()方法代码
public int point() { point = 0; // 长度计分修正 int len = password.length(); if (len >=8 && len <=12) { point += 1; } else if (len >12) { point += 2; } // 大写小写检测(原逻辑无问题可保留) String pass_upper = password.toUpperCase(); String pass_lower = password.toLowerCase(); for (int i = 0; i < password.length(); i++) { if (password.charAt(i) == pass_upper.charAt(i)) { point += 1; break; } } for (int k = 0; k < password.length(); k++) { if (password.charAt(k) == pass_lower.charAt(k)) { point += 1; break; } } // 数字检测修正 String digit = "0123456789"; digitLoop: for (int i = 0; i < password.length(); i++) { for (int k = 0; k < digit.length(); k++) { if (password.charAt(i) == digit.charAt(k)) { point += 1; break digitLoop; // 直接跳出数字检测的外层循环,仅加1分 } } } // 非字母数字字符检测修正 char[]non_alphabetic = { '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '-', '+'}; symbolLoop: for (int i = 0; i < password.length(); i++) { for (int k = 0; k < non_alphabetic.length; k++) { if (password.charAt(i) == non_alphabetic[k]) { point += 1; break symbolLoop; // 直接跳出符号检测的外层循环,仅加1分 } } } return point; }
验证结果
输入测试密码Hellllllo@123时,长度13位得2分、包含大写字母得1分、包含小写字母得1分、包含数字得1分、包含特殊符号得1分,总分为5分,符合预期结果。
内容的提问来源于stack exchange,提问作者Duke
相关产品推荐
相关产品推荐

