身份证校验,前台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校验的更多相关文章
- 前台js与后台方法互调
一:后台调用前台js的方法 ClientScript.RegisterStartupScript(ClientScript.GetType(), "myscript", " ...
- asp.net 调用前台JS调用后台,后台掉前台JS
C#前台js调用后台代码前台js<script type="text/javascript" language="javascript"> func ...
- ASP.NET前台JS与后台CS函数如何互相调用
摘要: 在实际的Web开发中,我们可能会常常遇到后台调用前台JS代码或者前台JS调用后台代码的情况.今天就把比较实用的前后台相互调用的方法总结出来和大家分享. 在实际的Web开发中,我们可能会常常遇到 ...
- [转]Asp.Net调用前台js调用后台代码分享
1.C#前台js调用后台代码 前台js <script type="text/javascript" language="javascript"> ...
- asp.net调用前台js调用后台代码分享
asp.net调用前台js调用后台代码分享 C#前台js调用后台代码前台js<script type="text/javascript" language="jav ...
- 敏捷自己主动化单元測试 (从前台 JavaScript 至后台 Java)
此份材料的内容适用于前台 JavaScript 与后台 Java 的单元測试◦ 希望, 能协助开发者可在最短的时间内, 开展单元測试的工作◦ 附件: 敏捷自己主动化单元測试 例子代码: QUnit 例 ...
- RSA前台js加密,后台C#解密
一.需求: 为了安全,项目中前台登陆用的密码需要加密传到后台,后台c#解密登陆密码. 二.解决方案 采用非对称加密算法RSA来达到目的,前台登陆页面一加载便发送一次ajax请求获取后台产生的公钥,用于 ...
- asp.net 前台js和后台得到FormView中的控件,以TextBox为例
一.前台js获取FormView中的控件 js得到前端控件的ID,比如TextBox(这里设置其ID为TextBox1),大家都知道,是document.getElementById("&l ...
- 前台js接收后台的json数据
后台返回的json数据,如php的: return json_encode($data); 在前台 js接收如下: function json2object(str){ var jsstr = str ...
随机推荐
- python用迭代器方式便利目录下的文件
from pathlib import Path pths = [pth for pth in Path.cwd().iterdir()] 如果是os.listdir()这会返回一个list,文件非常 ...
- css3画三角形的原理
以前用过css3画过下拉菜单里文字后面的“下拉三角符号”,类似于下面这张图片文字后面三角符号的效果 下面是一个很简单的向上的三角形代码 #triangle-up { width: 0; height: ...
- View & draw
When an iOS application is launched, it starts a run loop. The run loop’s job is to listen for event ...
- webpack 往右一点之 “模块这个东西”
为什么会考虑模块? webapp,页面初始化和使用过程中会加载越来越多的javascript代码 --- 给前端的开发流程和资源组织带来挑战 ---前端需要模块系统 模块系统是干什么的呢? 模块的定义 ...
- VS中附加进程的方式调试IIS页面,以及设置断点无效问题解决
以前调试网站的时候都习惯是直接在解决方案中右键调试——启动新实例,后来发现这样的缺点有: 1.启动比较慢: 2.一些浏览器的request参数无法带入: 3.不特殊指定启动url的话,VS会将页面加载 ...
- Maven构建项目后项目报Error错误Java compiler level does not match the version of the installed Java project fac
项目->右键->Project Facets->修改facets中Java版本(下拉箭头出)为要用的版本 Maven构建项目需注意 1.项目右键->Preferences-&g ...
- Docker Day1 & 2
1. Docker Basic 安装docker(在/etc/selinux/config文件中设置selinux=disabled,否则安装时会报错) curl -ssL http://get.do ...
- CSS 定位机制 position
position属性W3School有详细介绍 1.(position:relative;)相对定位会按照元素的原始位置对该元素进行移动.relative 2.(position:absolute;) ...
- Ninject之旅之三:Ninject对象生命周期
摘要 DI容器的一个责任是管理他创建的对象的生命周期.他应该决定什么时候创建一个给定类型的对象,什么时候使用已经存在的对象.他还需要在对象不需要的时候处理对象.Ninject在不同的情况下管理对象的生 ...
- 排序算法(JAVA)
import java.util.Random; /** * 排序测试类 * * 排序算法的分类如下: * 1.插入排序(直接插入排序.折半插入排序.希尔排序): * 2.交换排 ...