Posts Tagged ‘javascript’

javascript实现身份证号码的验证

星期三, 6月 4th, 2008

整理了一份javascript对身份证进行验证的程序。

源文件在: http://618119.com/docs/--escaped_anchor:e0dd5e818f3e8b2ef8dfd677654a4540--/shenfenzheng.html

javascript 代码为:
function getName(code){
var name=xzqh[code];
if(name==null){
return name;
}
//如果不是00结尾的,则补上市名称,659000例外 429000,469000
if(code%100 != 0 && (code-code%100)!=659000 && (code-code%100)!=429000 && (code-code%100)!=469000){
var cityName=xzqh[(code-code%100)];
if(cityName.length>1){//过滤掉只有一个字的“县”
name=cityName+name;
}
}
//如果不是0000结尾的,再补上省名称
if(code%10000 != 0){
name=xzqh[(code-code%10000)]+name;
}
return name;
}

function genData(){
var str=”";
for(code in xzqh){
//整理成竖线分隔的每行一条记录
str+=  “”+code  +”|” +getName(code) +”\n”;
}
document.getElementById(”soapres”).value=str;
}

function checkId(){
var code=document.getElementById(”idCode”).value;
if(code==null || ( code.length!=15 && code.length!=18)){
alert(”请输出正确长度的身份证号码!”);
return;
}

var xzqhCode=code.substr(0,6);
var xzqhName=getName(xzqhCode);

//先判断行政区划信息
if(xzqhName==null){
alert(”没有该身份证号码的地区信息,很可能是假身份证号码!”);
return;
}
//再判断是否都是数字和X.
for(var i=0;i<code.length;i++){
if(i<17){
if(code.charAt(i)>”9″ || code.charAt(i)<”0″){
alert(”你输入的身份证号码有误,可能是假身份证号码!”);
return;
}
}

if(i==17){//盘判断第17位
if(! ( (code.charAt(i) >= “0″ && code.charAt(i) <= “9″ )|| code.charAt(i)==’X’ || code.charAt(i)==’x') ){
alert(”你输入的身份证号码有误,可能是假身份证号码!”);
return ;
}
}
}

var year=1900;//出生年
var month=1;//出生月
var day=1;//出生日
var age=30;//年龄
var sex=”男”;//性别
var code15=”";//15位身份证
var code18=”";//18位身份证
var verify=”x”;//校验位
//按15位进行判断
if(code.length==15){
year=1900+parseInt(code.substr(6,1))*10+parseInt(code.substr(7,1));
month=parseInt(code.substr(8,1))*10+parseInt(code.substr(9,1));
if(month>12){
alert(”出生月份有错,可能是假身份证号码!”);
return ;
}
day=parseInt(code.substr(10,1))*10+parseInt(code.substr(11,1));
if(month>31){
alert(”出生日期有错,可能是假身份证号码!”);
return ;
}

var bday=new Date(year,month,day);
if(bday.getFullYear()!=year || bday.getMonth()!=month || bday.getDate()!=day){
alert(”出生年月日有错,可能是假身份证号码!”);
return ;
}

sex=parseInt(code.substr(14,1));
if(sex%2==1){
sex=”男”;
}
else{
sex=”女”;
}
age=parseInt(new Date().getFullYear())-parseInt(year);
code15=code;
code18=xzqhCode+”19″+code.substr(6,9);
verify=getVerify(code18);
code18=code18+verify;
}
//按18位进行判断
if(code.length==18){
year=parseInt(code.substr(6,1))*1000+parseInt(code.substr(7,1))*100+parseInt(code.substr(8,1))*10+parseInt(code.substr(9,1));
month=parseInt(code.substr(10,1))*10+parseInt(code.substr(11,1));
if(month>12){
alert(”出生月份有错,可能是假身份证号码!”);
return ;
}
day=parseInt(code.substr(12,1))*10+parseInt(code.substr(13,1));
if(month>31){
alert(”出生日期有错,可能是假身份证号码!”);
return ;
}
var bday=new Date(year,month,day);
if(bday.getFullYear()!=year || bday.getMonth()!=month || bday.getDate()!=day){
alert(”出生年月日有错,可能是假身份证号码!”);
return ;
}

if(bday.getTime()>=new Date().getTime()){
alert(”日期非法,可能是假身份证号码!”);
return ;
}
sex=parseInt(code.substr(16,1));
if(sex%2==1){
sex=”男”;
}
else{
sex=”女”;
}
verify=getVerify(code);
var tmpv=code.substr(17,1);
if(tmpv==”X”){tmpv=”x”};
if(verify!=tmpv){
alert(”身份证号码无法通过校验,可能是假身份证号码!”);
return ;
}
age=parseInt(new Date().getFullYear())-parseInt(year);
code18=code;
code15=code.substr(0,6)+code.substr(8,9);
}
var msg=”您输入的身份证号码:\t”+code+”\n\n”
+ “对应15位号码为:\t”+code15+”\n\n”
+ “对应18位号码为:\t”+code18+”\n\n”
+ “所在地区:\t”+xzqhName+”\n\n”
+ “出生日期:\t”+year+”年 “+month+” 月 “+day+” 日\n\n”
+ “年龄:\t”+age+” 岁\n\n”
+ “性别:\t”+sex+”\n”;
alert(msg);
}

function getVerify(id){
var result;
var nNum=eval(id.charAt(0)*7+id.charAt(1)*9+id.charAt(2)*10+id.charAt(3)*5+id.charAt(4)*8+id.charAt(5)*4+id.charAt(6)*2+id.charAt(7)*1+id.charAt(8)*6+id.charAt(9)*3+id.charAt(10)*7+id.charAt(11)*9+id.charAt(12)*10+id.charAt(13)*5+id.charAt(14)*8+id.charAt(15)*4+id.charAt(16)*2);
nNum=nNum%11;
switch (nNum) {
case 0 :
result=”1″;
break;
case 1 :
result=”0″;
break;
case 2 :
result=”x”;
break;
case 3 :
result=”9″;
break;
case 4 :
result=”8″;
break;
case 5 :
result=”7″;
break;
case 6 :
result=”6″;
break;
case 7 :
result=”5″;
break;
case 8 :
result=”4″;
break;
case 9 :
result=”3″;
break;
case 10 :
result=”2″;
break;
}
return result;
}
//–>
</SCRIPT>
<FORM id=”idCard” METHOD=POST ACTION=”">

http://618119.com<br/>
身份证号码验证程序,行政区划数据来源为:最新县及县以上行政区划代码(截止2007年12月31日)<br/> http://www.stats.gov.cn/tjbz/xzqhdm/t20080215_402462675.htm<br/>
请输入15位或18位身份证号码:<br/>
<input type=”text” name=”idCode” id=”idCode” value=”" size=”18″ maxlength=”18″  /><br/>
<input type=”button” name=”codeSubmit” value=”提交” id=”codeSubmit” onclick=”checkId();”/> <br/>

Tags: javascript

Related posts

整理行政区划数据的几个操作步骤

星期六, 5月 31st, 2008

1.数据来源:
中华人民共和国统计局官方网站:

最新县及县以上行政区划代码(截止2007年12月31日)
http://www.stats.gov.cn/tjbz/xzqhdm/t20080215_402462675.htm

2.保存为文本文件。
3.使用EditPlus进行排序,再删除冗余信息
4.替换掉星号去掉 (*)和 (**)

5.替换空格,规整成javascript数组的形式.
需要替换的有” 县” ,空格个数从多到少的进行替换.

6.进行名称补全。
xxyyzz的,前面补上 xx0000和xxyy00的名字
然后xxyy00的,前面再补上xx0000的名字
这样每个行政区划代码对应的名称都是完整的了。

7.使用js进行控制,以生成各种想要的数据格式。

JavaScript代码在:

http://618119.com/docs/--escaped_anchor:e0dd5e818f3e8b2ef8dfd677654a4540--/xzqh.html

整理好的数据文本在:

http://618119.com/docs/--escaped_anchor:e0dd5e818f3e8b2ef8dfd677654a4540--/xzqh.txt

代码片段:

[code]

function getName(code){
var name=xzqh[code];
//如果不是00结尾的,则补上市名称,659000例外 429000,469000
if(code%100 != 0 && (code-code%100)!=659000 && (code-code%100)!=429000 && (code-code%100)!=469000){
var cityName=xzqh[(code-code%100)];
if(cityName.length>1){//过滤掉只有一个字的“县”
name=cityName+name;
}
}
//如果不是0000结尾的,再补上省名称
if(code%10000 != 0){
name=xzqh[(code-code%10000)]+name;
}
return name;
}

[/code]

数据节选:

110000|北京市
110100|北京市市辖区
110101|北京市市辖区东城区
110102|北京市市辖区西城区
110103|北京市市辖区崇文区
110104|北京市市辖区宣武区
110105|北京市市辖区朝阳区
110106|北京市市辖区丰台区
110107|北京市市辖区石景山区
110108|北京市市辖区海淀区
110109|北京市市辖区门头沟区
110111|北京市市辖区房山区
110112|北京市市辖区通州区
110113|北京市市辖区顺义区
110114|北京市市辖区昌平区
110115|北京市市辖区大兴区
110116|北京市市辖区怀柔区
110117|北京市市辖区平谷区
110200|北京市县
110228|北京市密云县
110229|北京市延庆县
120000|天津市
120100|天津市市辖区
120101|天津市市辖区和平区
120102|天津市市辖区河东区
120103|天津市市辖区河西区
120104|天津市市辖区南开区
120105|天津市市辖区河北区
120106|天津市市辖区红桥区
120107|天津市市辖区塘沽区
120108|天津市市辖区汉沽区
120109|天津市市辖区大港区
120110|天津市市辖区东丽区
120111|天津市市辖区西青区
120112|天津市市辖区津南区
120113|天津市市辖区北辰区
120114|天津市市辖区武清区
120115|天津市市辖区宝坻区
120200|天津市县
120221|天津市宁河县
120223|天津市静海县
120225|天津市蓟县

Tags: gis, javascript, 行政区划

Related posts

关于分布式负载均衡的几个设置

星期二, 1月 29th, 2008

服务器对外的展现要统一,简洁。
即用户在URL里看到的地址是很方便记忆的。

而对于页面中嵌入的图片,脚本,样式表,视频,音频等文件,则可以放在其它服务器上。

第一层: DNS记录轮询负载均衡
www.google.com为例进行分析
1.首先是将 www.google.com,指定多个cname,根据不同的网络线路请求得到不同的别名

比如在中国得到的别名为:www.l.google.com,
www.l.google.com 的别名为: www-china.l.google.com

www-china.l.google.com再指定多个ip的a记录,
例如 ip 64.233.189.99, 64.233.189.104,64.233.167.147.

99,104,147这三个ip分别实现ip别名绑定,即如果99这个ip挂了,104会自动接管该ip到本机。

通过这样的方式,保证用户最终访问到的ip始终在线。

在cname解析的地方,可以使用多层cname解析,以实现更细粒度的负载均衡并灵活切换。

假设当www-china.l.google.com下整个节点都断网了,则只需要将www.l.google.com指向www-usa.l.google.com这样就可以切换了。

(纯属猜测:指定了cname的域名,则不要再配置a记录,因为a记录的优先级比cname高。)

dns解析过程记录如下:

[code]
E:\>nslookup
DNS request timed out.
timeout was 2 seconds.
*** Can’t find server name for address 192.168.18.1: Timed out
*** Default servers are not available
Default Server:  UnKnown
Address:  192.168.18.1

> server 202.96.128.86
DNS request timed out.
timeout was 2 seconds.
Default Server:  [202.96.128.86]
Address:  202.96.128.86

> server 202.96.128.86
Default Server:  cache-a.guangzhou.gd.cn
Address:  202.96.128.86

> set q=cname
> www.google.com
Server:  cache-a.guangzhou.gd.cn
Address:  202.96.128.86

Non-authoritative answer:
www.google.com  canonical name = www.l.google.com
> www.l.google.com
Server:  cache-a.guangzhou.gd.cn
Address:  202.96.128.86

Non-authoritative answer:
www.l.google.com        canonical name = www-china.l.google.com
> www-china.l.google.com
Server:  cache-a.guangzhou.gd.cn
Address:  202.96.128.86

l.google.com
primary name server = f.l.google.com
responsible mail addr = dns-admin.google.com
serial  = 1331146
refresh = 900 (15 mins)
retry   = 900 (15 mins)
expire  = 1800 (30 mins)
default TTL = 60 (1 min)
> set q=a
> www-china.l.google.com
Server:  cache-a.guangzhou.gd.cn
Address:  202.96.128.86

Non-authoritative answer:
Name:    www-china.l.google.com
Addresses:  64.233.189.99, 64.233.189.104

[/code]

(也可用这个命令查询: dig @202.96.128.86 www.google.com +trace)

第二层,服务端请求分发。

前端的ip得到客户端的请求,并不是在本机进行业务逻辑处理,而是对请求进行初步解析过滤,再分发给其它服务器进行处理,
请求分发规则通常是基于url的,也可根据其它附加条件进行分发,例如GET/POST,user-Agent,remoteAddr,urlhash等。

第三层:客户端分发请求。

通常用于对图片资源的请求进行分发,按找浏览器的默认限制,对同一服务器的并发连接不超过2个,
因此,假设一个网页里要显示40张图片,而这40张图片,如果使用同一个域名的话,及时后台做了请求分发,
而受浏览器的限制,假设一秒中下载两张图,打开这40张图片,也需要20秒,

而在采取客户端分发请求的模式,将图片的链接自动分布的请求到远程多台服务器,那么以同时请求5台为例,则相当于将对网站的并发请求提高了 5倍,
获得了了10个并发请求。
不光是图片资源,其它资源也都可以采取这种模式,url的动态分布,可以在服务端生成html代码的时候完成,
也可以在html的Javascript中预先存放一个可用服务器列表

www.flickr.com为例:

http://farm1.static.flickr.com/
http://farm2.static.flickr.com/
http://farm3.static.flickr.com/
……
http://farmx.static.flickr.com/

Tags: DNS, javascript, 负载均衡, 集群

Related posts