身份证校验,前台js校验,后台java校验
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了身份证校验,前台js校验,后台java校验相关的知识,希望对你有一定的参考价值。
js校验:
- var vcity={ 11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",
- 21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",
- 33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",
- 42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",
- 51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",
- 63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"
- };
- checkCard = function()
- {
- var card = document.getElementById(‘card_no‘).value;
- //是否为空
- if(card === ‘‘)
- {
- alert(‘请输入身份证号,身份证号不能为空‘);
- document.getElementById(‘card_no‘).focus;
- return false;
- }
- //校验长度,类型
- if(isCardNo(card) === false)
- {
- alert(‘您输入的身份证号码不正确,请重新输入‘);
- document.getElementById(‘card_no‘).focus;
- return false;
- }
- //检查省份
- if(checkProvince(card) === false)
- {
- alert(‘您输入的身份证号码不正确,请重新输入‘);
- document.getElementById(‘card_no‘).focus;
- return false;
- }
- //校验生日
- if(checkBirthday(card) === false)
- {
- alert(‘您输入的身份证号码生日不正确,请重新输入‘);
- document.getElementById(‘card_no‘).focus();
- return false;
- }
- //检验位的检测
- if(checkParity(card) === false)
- {
- alert(‘您的身份证校验位不正确,请重新输入‘);
- document.getElementById(‘card_no‘).focus();
- return false;
- }
- alert(‘OK‘);
- return true;
- };
- //检查号码是否符合规范,包括长度,类型
- isCardNo = function(card)
- {
- //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X
- var reg = /(^\d{15}$)|(^\d{17}(\d|X)$)/;
- if(reg.test(card) === false)
- {
- return false;
- }
- return true;
- };
- //取身份证前两位,校验省份
- checkProvince = function(card)
- {
- var province = card.substr(0,2);
- if(vcity[province] == undefined)
- {
- return false;
- }
- return true;
- };
- //检查生日是否正确
- checkBirthday = function(card)
- {
- var len = card.length;
- //身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字
- if(len == ‘15‘)
- {
- var re_fifteen = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/;
- var arr_data = card.match(re_fifteen);
- var year = arr_data[2];
- var month = arr_data[3];
- var day = arr_data[4];
- var birthday = new Date(‘19‘+year+‘/‘+month+‘/‘+day);
- return verifyBirthday(‘19‘+year,month,day,birthday);
- }
- //身份证18位时,次序为省(3位)市(3位)年(4位)月(2位)日(2位)校验位(4位),校验位末尾可能为X
- if(len == ‘18‘)
- {
- var re_eighteen = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/;
- var arr_data = card.match(re_eighteen);
- var year = arr_data[2];
- var month = arr_data[3];
- var day = arr_data[4];
- var birthday = new Date(year+‘/‘+month+‘/‘+day);
- return verifyBirthday(year,month,day,birthday);
- }
- return false;
- };
- //校验日期
- verifyBirthday = function(year,month,day,birthday)
- {
- var now = new Date();
- var now_year = now.getFullYear();
- //年月日是否合理
- if(birthday.getFullYear() == year && (birthday.getMonth() + 1) == month && birthday.getDate() == day)
- {
- //判断年份的范围(3岁到100岁之间)
- var time = now_year - year;
- if(time >= 3 && time <= 100)
- {
- return true;
- }
- return false;
- }
- return false;
- };
- //校验位的检测
- checkParity = function(card)
- {
- //15位转18位
- card = changeFivteenToEighteen(card);
- var len = card.length;
- if(len == ‘18‘)
- {
- var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
- var arrCh = new Array(‘1‘, ‘0‘, ‘X‘, ‘9‘, ‘8‘, ‘7‘, ‘6‘, ‘5‘, ‘4‘, ‘3‘, ‘2‘);
- var cardTemp = 0, i, valnum;
- for(i = 0; i < 17; i ++)
- {
- cardTemp += card.substr(i, 1) * arrInt[i];
- }
- valnum = arrCh[cardTemp % 11];
- if (valnum == card.substr(17, 1))
- {
- return true;
- }
- return false;
- }
- return false;
- };
- //15位转18位身份证号
- changeFivteenToEighteen = function(card)
- {
- if(card.length == ‘15‘)
- {
- var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
- var arrCh = new Array(‘1‘, ‘0‘, ‘X‘, ‘9‘, ‘8‘, ‘7‘, ‘6‘, ‘5‘, ‘4‘, ‘3‘, ‘2‘);
- var cardTemp = 0, i;
- card = card.substr(0, 6) + ‘19‘ + card.substr(6, card.length - 6);
- for(i = 0; i < 17; i ++)
- {
- cardTemp += card.substr(i, 1) * arrInt[i];
- }
- card += arrCh[cardTemp % 11];
- return card;
- }
- return card;
- };
后台java校验:
package
com.api.util;
import
java.util.Calendar;
import
java.util.GregorianCalendar;
import
java.util.HashMap;
import
java.util.Map;
/**
* 身份证验证的工具(支持5位或18位省份证)
* 身份证号码结构:
* 17位数字和1位校验码:6位地址码数字,8位生日数字,3位出生时间顺序号,1位校验码。
* 地址码(前6位):表示对象常住户口所在县(市、镇、区)的行政区划代码,按GB/T2260的规定执行。
* 出生日期码,(第七位 至十四位):表示编码对象出生年、月、日,按GB按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
* 顺序码(第十五位至十七位):表示在同一地址码所标示的区域范围内,对同年、同月、同日出生的人编订的顺序号,
* 顺序码的奇数分配给男性,偶数分配给女性。
* 校验码(第十八位数):
* 十七位数字本体码加权求和公式 s = sum(Ai*Wi), i = 0,,16,先对前17位数字的权求和;
* Ai:表示第i位置上的身份证号码数字值.Wi:表示第i位置上的加权因.Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2;
* 计算模 Y = mod(S, 11)
* 通过模得到对应的校验码 Y: 0 1 2 3 4 5 6 7 8 9 10 校验码: 1 0 X 9 8 7 6 5 4 3 2
*/
public
class
IDCardUtil {
final
static
Map<Integer, String> zoneNum =
new
HashMap<Integer, String>();
static
{
zoneNum.put(
11
,
"北京"
);
zoneNum.put(
12
,
"天津"
);
zoneNum.put(
13
,
"河北"
);
zoneNum.put(
14
,
"山西"
);
zoneNum.put(
15
,
"内蒙古"
);
zoneNum.put(
21
,
"辽宁"
);
zoneNum.put(
22
,
"吉林"
);
zoneNum.put(
23
,
"黑龙江"
);
zoneNum.put(
31
,
"上海"
);
zoneNum.put(
32
,
"江苏"
);
zoneNum.put(
33
,
"浙江"
);
zoneNum.put(
34
,
"安徽"
);
zoneNum.put(
35
,
"福建"
);
zoneNum.put(
36
,
"江西"
);
zoneNum.put(
37
,
"山东"
);
zoneNum.put(
41
,
"河南"
);
zoneNum.put(
42
,
"湖北"
);
zoneNum.put(
43
,
"湖南"
);
zoneNum.put(
44
,
"广东"
);
zoneNum.put(
45
,
"广西"
);
zoneNum.put(
46
,
"海南"
);
zoneNum.put(
50
,
"重庆"
);
zoneNum.put(
51
,
"四川"
);
zoneNum.put(
52
,
"贵州"
);
zoneNum.put(
53
,
"云南"
);
zoneNum.put(
54
,
"西藏"
);
zoneNum.put(
61
,
"陕西"
);
zoneNum.put(
62
,
"甘肃"
);
zoneNum.put(
63
,
"青海"
);
zoneNum.put(
64
,
"新疆"
);
zoneNum.put(
71
,
"台湾"
);
zoneNum.put(
81
,
"香港"
);
zoneNum.put(
82
,
"澳门"
);
zoneNum.put(
91
,
"外国"
);
}
final
static
int
[] PARITYBIT = {
‘1‘
,
‘0‘
,
‘X‘
,
‘9‘
,
‘8‘
,
‘7‘
,
‘6‘
,
‘5‘
,
‘4‘
,
‘3‘
,
‘2‘
};
final
static
int
[] POWER_LIST = {
7
,
9
,
10
,
5
,
8
,
4
,
2
,
1
,
6
,
3
,
7
,
9
,
10
,
5
,
8
,
4
,
2
};
/**
* 身份证验证
*@param s 号码内容
*@return 是否有效 null和"" 都是false
*/
public
static
boolean
isIDCard(String certNo){
if
(certNo ==
null
|| (certNo.length() !=
15
&& certNo.length() !=
18
))
return
false
;
final
char
[] cs = certNo.toUpperCase().toCharArray();
//校验位数
int
power =
0
;
for
(
int
i=
0
; i<cs.length; i++){
if
(i==cs.length-
1
&& cs[i] ==
‘X‘
)
break
;
//最后一位可以 是X或x
if
(cs[i]<
‘0‘
|| cs[i]>
‘9‘
)
return
false
;
if
(i < cs.length -
1
){
power += (cs[i] -
‘0‘
) * POWER_LIST[i];
}
}
//校验区位码
if
(!zoneNum.containsKey(Integer.valueOf(certNo.substring(
0
,
2
)))){
return
false
;
}
//校验年份
String year = certNo.length() ==
15
? getIdcardCalendar() + certNo.substring(
6
,
8
) :certNo.substring(
6
,
10
);
final
int
iyear = Integer.parseInt(year);
if
(iyear <
1900
|| iyear > Calendar.getInstance().get(Calendar.YEAR))
return
false
;
//1900年的PASS,超过今年的PASS
//校验月份
String month = certNo.length() ==
15
? certNo.substring(
8
,
10
) : certNo.substring(
10
,
12
);
final
int
imonth = Integer.parseInt(month);
if
(imonth <
1
|| imonth >
12
){
return
false
;
}
//校验天数
String day = certNo.length() ==
15
? certNo.substring(
10
,
12
) : certNo.substring(
12
,
14
);
final
int
iday = Integer.parseInt(day);
if
(iday <
1
|| iday >
31
)
return
false
;
//校验"校验码"
if
(certNo.length() ==
15
)
return
true
;
return
cs[cs.length -
1
] == PARITYBIT[power %
11
];
}
private
static
int
getIdcardCalendar() {
GregorianCalendar curDay =
new
GregorianCalendar();
int
curYear = curDay.get(Calendar.YEAR);
int
year2bit = Integer.parseInt(String.valueOf(curYear).substring(
2
));
return
year2bit;
}
public
static
void
main(String[] args) {
boolean
mark = isIDCard(
"450981198802261753"
);
System.out.println(mark);
}
}
以上是关于身份证校验,前台js校验,后台java校验的主要内容,如果未能解决你的问题,请参考以下文章