大陆居民身份证验证方法(java)
生活随笔
收集整理的這篇文章主要介紹了
大陆居民身份证验证方法(java)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、設置接口
@Constraint(validatedBy = ChineseIdNumberValidator.class) @Target({ElementType.METHOD,ElementType.FIELD,ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface IdNumber {String message() default "{common.IdNumber.Pattern}";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {}; }2、編寫Validator
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger;import javax.validation.ConstraintValidatorContext;/**** <p>* 判斷18位身份證的合法性* </p>* 根據〖中華人民共和國國家標準GB11643-1999〗中有關公民身份號碼的規定,公民身份號碼是特征組合碼,由十七位數字本體碼和一位數字校驗碼組成。* 排列順序從左至右依次為:六位數字地址碼,八位數字出生日期碼,三位數字順序碼和一位數字校驗碼。* <p>* 順序碼: 表示在同一地址碼所標識的區域范圍內,對同年、同月、同 日出生的人編定的順序號,順序碼的奇數分配給男性,偶數分配 給女性。* </p>* <p>* 1.前1、2位數字表示:所在省份的代碼; 2.第3、4位數字表示:所在城市的代碼; 3.第5、6位數字表示:所在區縣的代碼;* 4.第7~14位數字表示:出生年、月、日; 5.第15、16位數字表示:所在地的派出所的代碼; 6.第17位數字表示性別:奇數表示男性,偶數表示女性;* 7.第18位數字是校檢碼:也有的說是個人信息碼,一般是隨計算機的隨機產生,用來檢驗身份證的正確性。校檢碼可以是0~9的數字,有時也用x表示。* </p>* <p>* 第十八位數字(校驗碼)的計算方法為: 1.將前面的身份證號碼17位數分別乘以不同的系數。從第一位到第十七位的系數分別為:7 9 10 5 8 4 2 1* 6 3 7 9 10 5 8 4 2* </p>* <p>* 2.將這17位數字和系數相乘的結果相加。* </p>* <p>* 3.用加出來和除以11,看余數是多少?* </p>* 4.余數只可能有0 1 2 3 4 5 6 7 8 9 10這11個數字。其分別對應的最后一位身份證的號碼為1 0 X 9 8 7 6 5 4 3 2。* <p>* 5.通過上面得知如果余數是2,就會在身份證的第18位數字上出現羅馬數字的Ⅹ。如果余數是10,身份證的最后一位號碼就是2。* </p>** <p>* 對于15位身份證,不需要判斷最后一位驗證碼,最后一位代表性別,奇數表示男性,偶數表示女性 默認使用18位身份證號,15位也支持* </p>** @author rooseek***/ public class ChineseIdNumberValidator implements ConstraintValidator {private final static Map<String, String> code2Province = new HashMap<String, String>() {private static final long serialVersionUID = 1L;{this.put("11", "北京");this.put("12", "天津");this.put("13", "河北");this.put("14", "山西");this.put("15", "內蒙古");this.put("21", "遼寧");this.put("22", "吉林");this.put("23", "黑龍江");this.put("31", "上海");this.put("32", "江蘇");this.put("33", "浙江");this.put("34", "安徽");this.put("35", "福建");this.put("36", "江西");this.put("37", "山東");this.put("41", "河南");this.put("42", "湖北");this.put("43", "湖南");this.put("44", "廣東");this.put("45", "廣西");this.put("46", "海南");this.put("50", "重慶");this.put("51", "四川");this.put("52", "貴州");this.put("53", "云南");this.put("54", "西藏");this.put("61", "陜西");this.put("62", "甘肅");this.put("63", "青海");this.put("64", "寧夏");this.put("65", "新疆");}};private static final int weightFactor[] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};private static final String checkCode[] = {"1", "0", "X", "9", "8", "7", "6", "5","4", "3", "2"};private static final GregorianCalendar calendar = (GregorianCalendar) GregorianCalendar.getInstance();@Overridepublic void initialize(IdNumber constraintAnnotation) {}@Overridepublic boolean isValid(String idNumber, ConstraintValidatorContext context) {if (idNumber == null) {return true;}return isValid(idNumber);}protected boolean isValid(String idNumber) {if (idNumber == null) {return true;}if (idNumber.length() == 15) {return isValid15(idNumber);} else if (idNumber.length() == 18) {return isValid18(idNumber);}return false;}private boolean isValid15(String idNumber) {if (idNumber == null || idNumber.length() != 15) {return false;}if (!isDigital(idNumber)) {return false;}//check province codeString province = idNumber.substring(0, 2);if (!code2Province.containsKey(province)) {return false;}//check birthdayString birthday = idNumber.substring(6, 12);int month = Integer.parseInt(idNumber.substring(8, 10));int day = Integer.parseInt(idNumber.substring(10, 12));//check birthday format and whether this date is before current timeDate birthDate = null;try {birthDate = new SimpleDateFormat("yyMMdd").parse(birthday);} catch (ParseException ex) {Logger.getLogger(ChineseIdNumberValidator.class.getName()).log(Level.SEVERE, null, ex);}if (birthDate == null || System.currentTimeMillis() <= birthDate.getTime()) {return false;}//check year, month, day calendar.setTime(birthDate);if (calendar.get(Calendar.YEAR) < IdNumberConstant.MIN_YEAR) {return false;}if (month < 1 || month > 12) {return false;}switch (month) {case 1:case 3:case 5:case 7:case 8:case 10:case 12:if (day < 1 || day > 31) {return false;}case 4:case 6:case 9:case 11:if (day < 1 || day > 30) {return false;}case 2:if (calendar.isLeapYear(calendar.get(Calendar.YEAR))) {if (day < 1 || day > 29) {return false;}} else {if (day < 1 || day > 28) {return false;}}}return true;}private boolean isValid18(String idNumber) {if (idNumber == null || idNumber.length() != 18) {return false;}String idNumber17 = idNumber.substring(0, 17);String idNumber18Code = idNumber.substring(17, 18);char charArray[];//check prefix 17 numbers are all digitalif (isDigital(idNumber17)) {charArray = idNumber17.toCharArray();} else {return false;}//check region codeString province = idNumber.substring(0, 2);if (!code2Province.containsKey(province)) {return false;}//check birthdayString birthday = idNumber.substring(6, 14);int year = Integer.parseInt(idNumber.substring(6, 10));int month = Integer.parseInt(idNumber.substring(10, 12));int day = Integer.parseInt(idNumber.substring(12, 14));//check birthday format and whether this date is before current timeDate birthDate = null;try {birthDate = new SimpleDateFormat("yyyyMMdd").parse(birthday);} catch (ParseException ex) {Logger.getLogger(ChineseIdNumberValidator.class.getName()).log(Level.SEVERE, null, ex);}if (birthDate == null || System.currentTimeMillis() <= birthDate.getTime()) {return false;}//check year, month, dayif (year < IdNumberConstant.MIN_YEAR) {return false;}if (month < 1 || month > 12) {return false;}switch (month) {case 1:case 3:case 5:case 7:case 8:case 10:case 12:if (day < 1 || day > 31) {return false;}break;case 4:case 6:case 9:case 11:if (day < 1 || day > 30) {return false;}break;case 2:if (isLeapYear(year)) {if (day < 1 || day > 29) {return false;}} else {if (day < 1 || day > 28) {return false;}}break;}//check the sum of prefix 17 numbers mutilplied by weighted factor equals the last check codeif (null != charArray) {if (!idNumber18Code.equals(getCheckCode(getPowerSum(char2Int(charArray))))) {return false;}}return true;}@SuppressWarnings("unused")private String convert15To18(String idNumber) {if (idNumber.length() != 15) {return null;}String idNumber17;if (isDigital(idNumber)) {String birthday = idNumber.substring(6, 12);Date birthdate = null;try {birthdate = new SimpleDateFormat("yyMMdd").parse(birthday);} catch (ParseException ex) {Logger.getLogger(ChineseIdNumberValidator.class.getName()).log(Level.SEVERE, null, ex);}calendar.setTime(birthdate);String year = String.valueOf(calendar.get(Calendar.YEAR));idNumber17 = idNumber.substring(0, 6) + year + idNumber.substring(8);char charArray[] = idNumber17.toCharArray();if (null != charArray) {int sum17 = getPowerSum(char2Int(charArray));idNumber17 += getCheckCode(sum17);}} else {return null;}return idNumber17;}private boolean isDigital(String str) {return str == null || "".equals(str) ? false : str.matches("[0-9]*");}private int getPowerSum(int[] bit) {int sum = 0;if (weightFactor.length != bit.length) {return sum;}for (int i = 0; i < bit.length; i++) {sum = sum + bit[i] * weightFactor[i];}return sum;}private String getCheckCode(int sum17) {return checkCode[sum17 % 11];}private int[] char2Int(char[] charArray) throws NumberFormatException {int[] array = new int[charArray.length];int k = 0;for (char temp : charArray) {array[k++] = Integer.parseInt(String.valueOf(temp));}return array;}@SuppressWarnings("unused")private boolean isValidIdRegion(String region) {if (!Regions.isValidRegion(region)) {return false;}//idNumber start with something like "110000 北京市/110100 市轄區/110200 縣" is not validif (region.substring(4, 6).equals(IdNumberConstant.CITY_SUFFIX)) {return false;}//臺灣 香港 澳門暫時屏蔽String province = region.substring(0, 2);if (!isValidProvince(province)) {return false;}return true;}private boolean isValidProvince(String province) {return !(province.equals(IdNumberConstant.TAIWANG)|| province.equals(IdNumberConstant.HONGKONG)|| province.equals(IdNumberConstant.MACAU));}private boolean isLeapYear(int year) {return (year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0);} }?
轉載于:https://www.cnblogs.com/feika/p/4441582.html
總結
以上是生活随笔為你收集整理的大陆居民身份证验证方法(java)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言jj斗地主源码,GitHub -
- 下一篇: css之自定义字体