700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Java 后台验证码汉字拼音校验

Java 后台验证码汉字拼音校验

时间:2021-04-24 20:33:20

相关推荐

Java 后台验证码汉字拼音校验

Java 后台验证码汉字拼音校验

依赖

<dependency><groupId>com.belerweb</groupId><artifactId>pinyin4j</artifactId><version>2.5.1</version></dependency>

实体类

import java.util.List;public class Verification {private List<String> chineseList;private String pinyin;public Verification(List<String> chineseList, String pinyin) {this.chineseList = chineseList;this.pinyin = pinyin;}public Verification() {}public List<String> getChineseList() {return chineseList;}public String getPinyin() {return pinyin;}}

工具类

import net.sourceforge.pinyin4j.PinyinHelper;import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;import java.io.UnsupportedEncodingException;import java.util.*;import java.util.stream.IntStream;/*** 验证码思路:返回一个汉字的拼音,和一组汉字,根据拼音选择符合该拼音的汉字*/public class PinyinUtil {private static HashMap<String,Long> mappings = new HashMap<>();private static final int MAX_MAPPING_SIZE = 1 << 16;/*** 调用这个方法,返回Verification实体类* @return*/public static Verification getVerification(){// 如果mappings的size到了MAX_MAPPING_SIZE,就当作是恶意请求,然后删除两小时内的mapif (mappings.size() == MAX_MAPPING_SIZE){long exp = 1000 * 60 * 60 * 2;long excludeTime = System.currentTimeMillis() - exp;mappings.entrySet().stream().filter(entry->entry.getValue() > excludeTime).forEach(e->mappings.remove(e.getKey()));}String chinese = getRandomChinese();String pinyin = toPinyin(chinese);ArrayList<String> chineseList = new ArrayList<>(9);chineseList.add(chinese);mappings.put(chinese,System.currentTimeMillis());IntStream.range(0,8).forEach(i->chineseList.add(getRandomChinese()));chineseList.sort(String::compareTo);return new Verification(chineseList, pinyin);}/*** 校验方法* @return*/public static boolean match(String pinyin,String chinese){if (mappings.get(chinese) == null)return false;if (!validate(pinyin, chinese))return false;String s = toPinyin(chinese);mappings.remove(chinese);return pinyin.equals(s);}private static String toPinyin(String chinese){StringBuffer buffer = new StringBuffer();char[] newChar = chinese.toCharArray();HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);for (int i = 0; i < newChar.length; i++) {if (newChar[i] > 128) {try {buffer.append(PinyinHelper.toHanyuPinyinStringArray(newChar[i], defaultFormat)[0]);} catch (BadHanyuPinyinOutputFormatCombination e) {e.printStackTrace();}}else{buffer.append(newChar[i]);}}return buffer.toString();}private static boolean validate(String pinyin,String chinese){if (pinyin == null || "".equals(pinyin))return false;if (chinese == null || "".equals(chinese))return false;return true;}private static String getRandomChinese() {String str = "";Random random = new Random();int highCode = (176 + Math.abs(random.nextInt(39))); //B0 + 0~39(16~55) 一级汉字所占区int lowCode = (161 + Math.abs(random.nextInt(93))); //A1 + 0~93 每区有94个汉字byte[] b = new byte[2];b[0] = (Integer.valueOf(highCode)).byteValue();b[1] = (Integer.valueOf(lowCode)).byteValue();try {str = new String(b, "GBK");} catch (UnsupportedEncodingException e) {e.printStackTrace();}return str;}/*** 控制台测试一下* @param args*/public static void main(String[] args) {// Verification verification = getVerification();// String pinyin = verification.getPinyin();// List<String> chineseList = verification.getChineseList();// System.out.println("拼音:"+pinyin);// System.out.println("请在集合中选出一个符合上面拼音的文字:"+chineseList);// Scanner scanner = new Scanner(System.in);// if (scanner.hasNextLine()){// String s = scanner.nextLine();// if (match(pinyin,s)){//System.out.println("匹配成功");// }else {//System.out.println("匹配失败!");// }// }}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。