JS前后端实现身份证号验证代码解析


Posted in Javascript onJuly 23, 2020

前言

实名制是许多网站都必备的功能,因此用户经常需要输入身份证号,但是我们无法连通公安局的数据库进行验证身份证和姓名地址是否匹配,因此可以根据身份证生成的规则来进行身份证格式的验证,以下仅介绍二代身份证的验证。

计算公式

公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。

排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码。

1、地址码:表示编码对象常住户口所在县(市、旗、区)的行政区域划分代码,按GB/T2260的规定执行。

2、出生日期码:表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。

3、顺序码:表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。

4、校验码计算步骤:

(1)十七位数字本体码加权求和公式:

S = Sum(Ai * Wi), i = 0, … , 16 ,先对前17位数字的权求和;

Ai:表示第i位置上的身份证号码数字值(0~9);

Wi:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 (表示第i位置上的加权因子);

(2)计算模:Y = mod(S, 11);

(3)根据模,查找得到对应的校验码:Y: 0 1 2 3 4 5 6 7 8 9 10

校验码: 1 0 X 9 8 7 6 5 4 3 2;

前端验证

const weight = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];//十七位数字本体码权重
const validate = ['1','0','X','9','8','7','6','5','4','3','2'];//mod11,对应校验码字符值

function getValidateCode(id17){
 let sum = 0;
 let mode = 0;
 [...id17].forEach((elem,i) => {
  sum=sum+parseInt(elem)*weight[i];
 });
 mode = sum % 11;
 return validate[mode];
}
console.log("该身份证验证码:"+ getValidateCode("14230219700101101"));//该身份证验证码:3

后端验证(Java)

public class Id18 {
 int[] weight={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};//十七位数字本体码权重
 char[] validate={ '1','0','X','9','8','7','6','5','4','3','2'};//mod11,对应校验码字符值  
 
 public char getValidateCode(String id17){
   int sum = 0;
   int mode = 0;
   for(int i = 0; i < id17.length(); i++){
     sum=sum+Integer.parseInt(String.valueOf(id17.charAt(i)))*weight[i];
   }
   mode = sum % 11;
   return validate[mode];
 }
 
 public static void main(String[] args){
   Id18 tes t= new Id18();
   System.out.println("该身份证验证码:"+test.getValidateCode("14230219700101101"));//该身份证校验码:3
 }
}

总结

身份证验证和手机号邮箱等格式验证是一样的,都要做前后端双重验证,前端验证不通过就不劳烦后端验证,减轻服务器的压力;

至于一代身份证的验证大家也可以查询下相关的算法,在原基础上改改即可,我感觉现在好像也没有一代身份证了,亦或者用一代身份证的人都不怎么上网,因此这里就不写了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript之ESC(第二类混淆)
May 06 Javascript
深入理解jQuery中live与bind方法的区别
Dec 18 Javascript
用jquery模仿的a的title属性的例子
Oct 22 Javascript
vue指令以及dom操作详解
Mar 04 Javascript
老生常谈js中0到底是 true 还是 false
Mar 08 Javascript
JavaScript实现封闭区域布尔运算的示例代码
Jun 25 Javascript
vue展示dicom文件医疗系统的实现代码
Aug 27 Javascript
jQuery选择器选中最后一个元素,倒数第二个元素操作示例
Dec 10 jQuery
vue2.0 如何在hash模式下实现微信分享
Jan 22 Javascript
详解如何使用router-link对象方式传递参数?
May 02 Javascript
JS事件流与事件处理程序实例分析
Aug 16 Javascript
微信小程序实现导航栏和内容上下联动功能代码
Jun 29 Javascript
vue实现用户长时间不操作自动退出登录功能的实现代码
Jul 23 #Javascript
在vue中封装的弹窗组件使用队列模式实现方法
Jul 23 #Javascript
基于JS实现计算24点算法代码实例解析
Jul 23 #Javascript
javascript递归函数定义和用法示例分析
Jul 22 #Javascript
简单了解vue 插值表达式Mustache
Jul 22 #Javascript
详解node.js 事件循环
Jul 22 #Javascript
jQuery+ThinkPHP实现图片上传
Jul 23 #jQuery
You might like
win7+apache+php+mysql环境配置操作详解
2013/06/10 PHP
php使用pdo连接sqlite3的配置示例
2016/05/27 PHP
php实现批量修改文件名称的方法
2016/07/23 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
javascript中的Function.prototye.bind
2015/06/25 Javascript
学习JavaScript设计模式(封装)
2015/11/26 Javascript
JavaScript基础知识及常用方法总结
2016/01/10 Javascript
再谈javascript注入 黑客必备!
2016/09/14 Javascript
12 款 JS 代码测试必备工具(翻译)
2016/12/13 Javascript
基于Node.js的WebSocket通信实现
2017/03/11 Javascript
详解vue-cli开发环境跨域问题解决方案
2017/06/06 Javascript
vue实现百度搜索下拉提示功能实例
2017/06/14 Javascript
微信小程序实现tab页面切换功能
2018/07/13 Javascript
详解Vue之父子组件传值
2019/04/01 Javascript
不刷新网页就能链接新的js文件方法总结
2020/03/01 Javascript
Vue实现移动端拖拽交换位置
2020/07/29 Javascript
vue a标签点击实现赋值方式
2020/09/07 Javascript
Python基于pygame实现图片代替鼠标移动效果
2015/11/11 Python
python cx_Oracle模块的安装和使用详细介绍
2017/02/13 Python
Python数据持久化shelve模块用法分析
2018/06/29 Python
Python解析命令行读取参数之argparse模块
2019/07/26 Python
Python编写带选项的命令行程序方法
2019/08/13 Python
Numpy中的数组搜索中np.where方法详细介绍
2021/01/08 Python
轻金属冶金专业毕业生自荐信
2013/11/02 职场文书
青年教师培训方案
2014/02/06 职场文书
幼儿教师工作感言
2014/02/14 职场文书
培训协议书范本
2014/04/22 职场文书
2015年女生节活动总结
2015/02/27 职场文书
辞职信范文大全
2015/03/02 职场文书
幼儿园食品安全责任书
2015/05/08 职场文书
音乐之声观后感
2015/06/04 职场文书
mysql 8.0.24 安装配置方法图文教程
2021/05/12 MySQL
缓存替换策略及应用(以Redis、InnoDB为例)
2021/07/25 Redis
Redis读写分离搭建的完整步骤
2021/09/14 Redis
JavaScript中document.activeELement焦点元素介绍
2021/11/27 Javascript
Mongodb 迁移数据块的流程介绍分析
2022/04/18 MongoDB