Java之实现简单中文笔画验证码
开发工具与关键技术:Java[MyEclipse 10]
作者:谢景
撰写时间:2019-5-06
在做项目中我们为了防止别人恶意提交,我们会进行验证码验证登录,我们常用的是随机验证码校对,例如下面这种
但是我本想实现随机中文验证码校对,但是发现现在的人所认识的文字太少,生僻字太多,
所以实现中文验证有点不实际,但我想了想了不管什么人,笔画总是学过的,所以实现中文笔画验证是可能的。
我在网上查阅很多资料,发现中文笔画验证也有人做过,但是所以人几乎写法大致一样,都是查找GB2312编码中的中文来实现验证,但我想没那么复杂的
首先,我们要想实现笔画验证,那么我们在代码中必须知道文字的笔画是多少才能跟用户写的笔画对应。
下面是我做了简单的中文笔画在五笔之内的笔画验证的Demo。
大致思路:
- 用数组存储文字,将笔画一样的文字放在用一个数组。
- 写个方法,随机抽取数组里的文字,返回文字和该文字的笔画。
- 调用上面方法,获取返回值。
- 进行笔画校对。
下面讲解一下具体代码实现:
首先,创建一个存放数组和方法的类CharacterStrokesRandom
第二、声明字符串数组的成员变量存放文字,
下面是我已经写好的数组中的数据,分别是五笔、四笔、三笔、二笔、一笔的文字。
private static String[] str5 = { "艾", "凹", "叭", "扒", "白", "半", "包", "北",
"本", "必", "边", "弁", "汃", "丙", "仢", "卟", "布", "册", "叱", "斥", "出",
"刍", "处", "匆", "丛", "刌", "打", "代", "旦", "氹", "叨", "忉", "氐", "电",
"叼", "汈", "叮", "饤", "东", "冬", "对", "戹", "尒", "尔", "发", "犯", "冯",
"弗", "付", "玍", "匄", "甘", "功", "古", "瓜", "丱", "归", "氿", "邗", "厈",
"汉", "夯", "号", "禾", "弘", "讧", "乎", "卉", "汇", "击", "刉", "叽", "饥",
"伋", "记", "加", "甲", "戋", "艽", "叫", "节", "讦", "纠", "旧", "句", "卡",
"刊", "尻", "可", "叩", "兰", "乐", "扐", "礼", "厉", "屴", "立", "辽", "令",
"另", "龙", "卢", "邙", "矛", "卯", "灭", "民", "皿", "末", "母", "仫", "目",
"奶", "艿", "尼", "鸟", "宁", "奴", "丕", "皮", "庀", "平", "叵", "扑", "讫",
"仟", "阡", "巧", "且", "卭", "邛", "丘", "叴", "囚", "犰", "去", "冉", "让",
"仞", "讱", "扔", "宂", "闪", "讪", "申", "生", "圣", "失", "石", "史", "矢",
"世", "仕", "市", "示", "术", "甩", "帅", "丝", "司", "四", "他", "它", "台",
"叹", "讨", "田", "汀", "艼", "圢", "头", "凸", "讬", "外", "未", "务", "戊",
"阢", "仙", "写", "兄", "玄", "穴", "训", "讯", "疋", "央", "业", "叶", "仪",
"匜", "仡", "议", "印", "永", "用", "由", "右", "幼", "玉", "驭", "夗", "匝",
"仄", "札", "轧", "乍", "占", "仗", "召", "正", "卮", "汁", "只", "阤", "主",
"仔", "左" };
private static String[] str4 = { "丰", "亓", "开", "井", "天", "夫", "元", "无",
"卞", "云", "专", "丐", "廿", "五", "币", "支", "卅", "不", "冇", "牙", "屯",
"互", "中", "内", "五", "壬", "升", "夭", "长", "反", "爻", "乏", "氏", "丹",
"乌", "为", "尹", "尺", "丑", "巴", "以", "予", "书", "王", "韦", "友", "孔",
"厅", "仄", "历", "厄", "区", "匹", "卡", "冈", "兮", "分", "六", "介", "从",
"仑", "今", "仓", "仁", "什", "订", "仃", "仆", "化", "仇", "仍", "仅", "双",
"勿", "允", "匀", "勾", "风", "亡", "亢", "冗", "凶", "切", "分", "刈", "办",
"劝", "邓", "艺", "太", "犬", "尤", "戈", "少", "爿", "闩", "幻", "木", "支",
"歹", "车", "比", "瓦", "止", "日", "曰", "月", "贝", "水", "见", "牛", "午",
"手", "气", "毛", "片", "爪", "父", "欠", "殳", "文", "方", "火", "斗", "户",
"心", "毋" };
private static String[] str3 = { "丈", "之", "夂", "子", "丫", "劜", "幺", "也",
"义", "亿", "已", "弋", "与", "于", "习", "夕", "下", "乡", "小", "彐", "卂",
"丸", "亾", "兦", "亡", "尢", "卫", "囗", "兀", "兀", "土", "乇", "三", "山",
"彡", "上", "勺", "士", "巳", "夊", "刃", "刄", "丌", "乞", "千", "卄", "女",
"亇", "马", "么", "门", "万", "口", "亏", "亼", "亽", "及", "己", "孑", "巾",
"久", "乆", "孓", "孒", "干", "个", "工", "弓", "廾", "凡", "凣", "凢", "飞",
"大", "才", "叉", "亍", "巛", "川", "寸", "广" };
private static String[] str2 = { "乃", "乂", "乄", "九", "了", "丁", "七", "丂",
"丄", "丅", "乜", "八", "勹", "匕", "卜", "厂", "刀", "刁", "儿", "二", "匚",
"几", "冂", "力", "人", "入", "十", "厶", "匸", "又", "", "", "" };
private static String[] str1 = { "一", "乙", "丶", "丨" };
第三、封装两个成员变量,一个记录文字,一个记录该文字的笔画
第四、封装方法,实现随机抽取文字,返回抽取的文字和笔画
public static List<CharacterStrokesRandom> getSuiJiShu(int number) {
//实例化Random随机数类
Random random = new Random();
//以自己所在的类CharacterStrokesRandom作为类型,创建list列表来存放抽取的文字和笔画
List<CharacterStrokesRandom> map = new ArrayList<CharacterStrokesRandom>();
//用for循环形参number的次数,以达到调用者想返回多少个文字的功能
for (int i = 0; i < number; i++) {
//实例化自己所在的类
CharacterStrokesRandom biHuaSuiJiShu = new CharacterStrokesRandom();
//声明局部变量SuiJiShu赋值为伪随机数的绝对值
//Math.abs(x)返回x的绝对值
int SuiJiShu = Math.abs(random.nextInt());
//将随机数除余数5,实现随机获取存储五种笔画的数组
int yuShu = SuiJiShu % 5;
//声明局部字符串变量,存放在数组中获取的文字
String string = "";
//将随机数SuiJiShu除余数对应数组的长度,以便防止数组越界异常
//str5为五笔;str4为四笔;str3为三笔;str2为两笔;str1为一笔
if (yuShu == 0) {
string = str5[SuiJiShu % str5.length];
yuShu = 5;
} else if (yuShu == 1) {
string = str1[SuiJiShu % str1.length];
} else if (yuShu == 2) {
string = str2[SuiJiShu % str2.length];
} else if (yuShu == 3) {
string = str3[SuiJiShu % str3.length];
} else if (yuShu == 4) {
string = str4[SuiJiShu % str4.length];
}
//将获取的文字和笔画存放到封装的成员变量中
biHuaSuiJiShu.setBiHua(yuShu);
biHuaSuiJiShu.setWenZi(string);
//将数据存放到list列表
map.add(biHuaSuiJiShu);
}
//返回list列表
return map;
}
到此实现笔画的功能已经写好了
第四、调用方法,验证效果
List<CharacterStrokesRandom> characterStrokesRandoms =CharacterStrokesRandom.getSuiJiShu(4);
String string="";
String string2="";
for (CharacterStrokesRandom characterStrokesRandom : characterStrokesRandoms) {
string+=characterStrokesRandom.getBiHua() ;
string2+=characterStrokesRandom.getWenZi();
}
System.out.println("请分别输入文字的笔画数:"+string2);
Scanner scan = new Scanner(System.in);
String str1 = scan.nextLine();
if(string.equals(str1)){
System.out.println("输入正确");
}else{
System.out.println("输入错误");
}
效果如下:
这只是个简单的Demo,后续我想实现显示中文和拼音,让别人可以在该功能中认识更多的文字。