身份证校验,前台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 ...
随机推荐
- OJ提交题目中的语言选项里G++与C++的区别(转)
G++? 首先更正一个概念,C++是一门计算机编程语言,G++不是语言,是一款编译器中编译C++程序的命令而已. 那么他们之间的区别是什么? 在提交题目中的语言选项里,G++和C++都代表编译的方式. ...
- Win 8.1 Pro &MSSQLServer 2014 Enterprise
给Thinkpad E431 安装上 Windows 8.1 Pro 之后,一直都安装不上 MSSQLServer 2005 DEV / ENT,2008 ENT / STAND, 2008 R2 ...
- 【解决】SQL Server作业中Excel Application不能访问文件
在通过SQL Server作业来实现定时任务时,出现如下错误: FullyQualifiedErrorId : ComMethodTargetInvocation使用“1”个参数调用“Add”时发生异 ...
- 问题解决_(转载)在VisualStudio 2012上使用MVC3出现错误的解决办法
错误: 找 不到方 法:“System.Collections.Generic.Dictionary`2<System.String,BlockParser> System.Web.Raz ...
- delphi.位操作
位操作网上有很多介绍,请上网google/baidu,比如: 位操作技巧实例大全: http://blog.csdn.net/g_spider/article/details/5750665 位操作基 ...
- 扩展 HtmlwebpackPlugin 插入自定义的脚本
webpack提供了一个如何开发 webpack 插件的介绍,你可以直接访问这里查看,这里提供一个扩展 HtmlWebpackPlugin 的开发实例. 前面我们介绍过 HtmlWebpackPlug ...
- sql 删除重复数据且保留其中一条 用sql 关键字:with ROW_NUMBER
--1.建立表:Coursecreate table Course( ID int identity(1,1),--ID Student varchar(20) ,--学生 Sub varchar(2 ...
- swift3.0 创建一个app引导页面
swift毕竟不像是oc ,第三方的框架很多,更何况是3.0,自己动手写了个引导页面,看得上我代码的麻友可以拿去用 引导页面有三个部分构成,scrollview用语切换引导视图,pageControl ...
- CSS 单行溢出文本显示省略号...的方法(兼容IE FF)(转)
http://www.52css.com/article.asp?id=602 =================================================== html ...
- Unity已经学会的
1.以MonoBehaviour为脚本的开发模式. 2.MonoBehaviour的大多数API. 3.动画系统大多数了解. 4.UI了解一些,能写UI. 5.Editor了解一些,能写Editor. ...