基于AJAX的Web注册系统设计与实现

作者:清欢

时间:2026-10-21

浏览:635

本文介绍了一个基于AJAX技术的Web注册系统,实现了用户名、密码、邮箱及验证码的异步实时校验。系统采用ASP与Access数据库,支持Firefox等多浏览器,并通过JavaScript DOM进行即时反馈,旨在提升用户注册体验与界面交互效率。

文章目录

项目概述与背景

项目名称:具有良好体验度的Web注册系统


作者:草履虫


联系方式:caolvchong@gmail.com


发布时间:2007-6-29


项目背景与版权声明:


1.受蓝色理想论坛上一位会员发布的类似系统启发,该原系统存在验证码在Firefox浏览器下无法刷新的问题,由此萌生了开发本系统的想法。本系统在外观(如按钮取色等)上借鉴了该系统,但底层实现原理完全不同(原文章地址:http://bbs.blueidea.com/thread-2761325-1-4.html)。


2.本注册系统中使用的无组件验证码功能,源自网络上的开源代码(作者sipo)。


3.密码强度检测算法借鉴了蓝色理想的一篇文章(http://www.blueidea.com/tech/web/2006/4324.asp),但该算法并非最优,若有更佳的算法实现,欢迎交流探讨。


系统特点与开发环境

系统特点与核心技术:


1.利用AJAX技术实现用户名和验证码的异步验证,并同时进行用户名的异步注册(属于AJAX的基础应用)。


2.支持验证码刷新功能,包括在Firefox平台下的正常使用。


3.利用JavaScript DOM技术,对密码、邮箱、用户名等进行即时检测与反馈。


4.HTML代码通过W3C Strict标准验证,CSS代码也通过W3C CSS标准验证(注:此项并非完全必要,但有助于规范代码)。


开发环境:Windows 2003服务器,IIS 6.0,Access数据库。


开发工具:DreamWeaver(用于编写ASP代码),Aptana(用于编写JavaScript、HTML和CSS),Emeditor(用于撰写本文),Access 2003(数据库)。


测试环境:Firefox 2.0, Opera 9.21, IE 6.0, IE 7.0。


演示地址:http://finish.3322.org/reg/reg.htm(短期有效,运行于本机,访问可能不稳定)。


原文地址:http://cceer.xmu.edu.cn/blog/view.asp?id=52


补充说明:


如果您使用此注册系统,请务必注意以下问题:


本系统未对密码进行加密处理,如需加密功能,可搜索MD5加密方案。


本系统未进行防SQL注入设置,如需增强安全性,可搜索SQL防注入方案。


受限于个人技术水平,系统中难免存在错误与不足,如有问题或建议,请联系作者,感谢支持!


前端界面实现

以下是系统效果图:


受限于文章篇幅,此处仅列出两个JavaScript文件和一个注册显示页面的代码,后台处理页面及CSS文件等请查看压缩包。


1. reg.htm(由于博客系统过滤,分三部分展示)


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">


<html xmlns="http://www.w3.org/1999/xhtml" lang="gb2312">


<head>


<meta http-equiv="Content-Type" content="text/html; charset=GB2312" />


<title>草履虫---简易AJAX注册页面</title>


<link href="reg.css" type="text/css" rel="stylesheet" />


<script src="detect.js" type="text/javascript"></script>


<script src="ajax.js" type="text/javascript"></script>


</head>


<body onload="check_data();">




view plaincopy to clipboardprint?


<UL>


<LI id=title>草履虫---Web注册系统


<LI class=underline>


<LABEL>注册用户名:


<INPUT onblur=check_id(this.value); maxLength=16>


</LABEL>


<SPAN>支持汉字,单词,数字,敏感字符屏蔽</SPAN>



<LI>


<LABEL>注册密码:


<INPUT onblur=check_password(); type=password value="">


</LABEL>


<SPAN>密码在6-16位之间,敏感字符屏蔽</SPAN>



<LI class=underline>


<LABEL>重复密码:


<INPUT onblur=check_pw(); type=password maxLength=16 value="">


</LABEL>


<SPAN></SPAN>



<LI class=underline>


<LABEL>邮箱:


<INPUT onblur=check_email(this.value)>


</LABEL>


<SPAN>email是联系重要手段</SPAN>



<LI class=underline>验证码:


<INPUT onblur=checkcode(this.value); maxLength=5>


<LABEL>


<IMG id=src onclick="this.src=this.src+'?'+Math.random();" height=18 alt=看不清楚?请点击刷新 src="getcode.asp">


<SPAN>看不清楚?请点击验证码刷新</SPAN>


</LABEL>



<LI class=underline>


相关协议:


<LABEL onclick=accept_info();><INPUT type=radio name=info>接受</LABEL>


<LABEL onclick=refuse_info();><INPUT type=radio name=info>不接受</LABEL>


<INPUT class=button type=button value=阅读协议>



<LI class=underline>


<INPUT class="button setleft" onclick="sendinfo($('input')[0].value,$('input')[1].value,$('input')[3].value)" type=submit value=注册>


<INPUT class=button onclick=reset_info() type=reset value=重置>


<SPAN></SPAN>



<LI class=copyright>作者:草履虫


<LI class=copyright>时间:2007-6-28


<LI class=copyright>联系:caolvchong@gmail.com


<LI class=copyright>Blog---Web2.0之路:<A href="http://cceer.xmu.edu.cn/blog/">http://cceer.xmu.edu.cn/blog/</A>


/LI></UL>



     

草履虫---Web注册系统



注册用户名:



            

支持汉字,单词,数字,敏感字符屏蔽



        

注册密码:



            

密码在6-16位之间,敏感字符屏蔽



        

重复密码:



            

        

邮箱:



            

email是联系重要手段



验证码:



            

看不清楚?请点击验证码刷新



        

相关协议:


接受


不接受



        

            

            

作者:草履虫


时间:2007-6-28


联系:caolvchong@gmail.com


Blog---Web2.0之路:http://cceer.xmu.edu.cn/blog/



</body>


</html>



前端校验逻辑

2. detect.js view plaincopy to clipboardprint?


var flag=[0,0,0,0,0,0];


var $=function(tagName){


return document.getElementsByTagName(tagName);


    }   

//----------接受协议


function accept_info(){


flag[0]=1;


check_data();


    }   

//----------拒绝协议


function refuse_info(){


flag[0]=0;


check_data();


    }   

//----------重置


function reset_info(){


var info=["支持汉字,单词,数字,敏感字符屏蔽","密码在6-16位之间,敏感字符屏蔽","","email是联系重要手段","看不清楚?请点击验证码刷新"]


for(var i=0;i<$("span").length;i++){


$("span")[i].innerHTML=info[i];


flag[i]=0;


        }   

for(var i=0;i<$("input").length-3;i++){


$("input")[i].value="";


        }   

check_data();


    }   

//----------邮箱检测


function check_email(email){


var reEmail=/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;


var b_email=reEmail.test(email);


if(b_email){


$("span")[3].innerHTML="<IMG src="yesok.gif"> 邮箱可用";


flag[1]=1;


check_data();


        }   

else{


$("span")[3].innerHTML="<IMG src="yesno.gif"> 邮箱错误";


flag[1]=0;


check_data();


        }   
    }   

//----------密码检测


function check_password(obj){


var pwd=$("input")[1].value;


var reChinese=/[\u0391-\uFFE5]+/;


var b_chinese=reChinese.test(pwd);


var reSpace=/\s+/;


var b_space=reSpace.test(pwd);


//-------长度测试


if(pwd.length<6){


$("span")[1].innerHTML="<IMG src="yesno.gif"> 密码长度不能小于6";


flag[2]=0;


check_data();


        }   

//-------合法性检测:不能包含汉字


else if(b_chinese){


$("span")[1].innerHTML="<IMG src="yesno.gif"> 密码不能包含中文";


flag[2]=0;


check_data();


        }   

//-------合法性检测:不能包含空格


else if(b_space){


$("span")[1].innerHTML="<IMG src="yesno.gif"> 密码不能包含空格";


flag[2]=0;


check_data();


        }   

//-------合法时显示密码强度


else{


//定义对应的消息提示


var num=getResult(pwd);


var msg=new Array("<IMG src="bad.gif"> 密码强度差","<IMG src="comm.gif"> 密码强度一般","<IMG src="good.gif"> 密码强度强壮");


$("span")[1].innerHTML=msg[num];


if($("input")[2].value!=""){


check_pw();


                }   

return flag[2]=1;


check_data();


            }   
        }   

//定义检测函数,返回0/1/2分别代表差/一般/强


function getResult(s){


var ls =-1;


if (s.match(/[a-z]/ig)){


ls++;


            }   

if (s.match(/[0-9]/ig)){


ls++;


            }   

if (s.match(/(.[^a-z0-9])/ig)){


ls++;


            }   

return ls;


        }   

//---------密码一致性检测


function check_pw(){


var pwd=$("input")[1].value.toString();


var check_pwd=$("input")[2].value.toString();


if(flag[2]==1){


if(pwd==check_pwd){


$("span")[2].innerHTML="<IMG src="yesok.gif"> 密码可以使用";


flag[3]=1;


check_data();


                }   

else{


$("span")[2].innerHTML="<IMG src="yesno.gif"> 两次密码不相同";


flag[3]=0;


check_data();


                }   
            }   
        }   

//---------用户名合法性检测


function check_id(id_name){//只能字母和数字,是否相同用AJAX判断


var reId=/^[\w\u0391-\uFFE5]+$/;


var b_id=reId.test(id_name);


if(!b_id){


$("span")[0].innerHTML="<IMG src="yesno.gif"> ID命名非法";


flag[4]=0;


check_data();


            }   

else{//合法用户名用ajax的checkid()检测是否被注册过


checkid(id_name);


            }   
        }   

//---------检查数据,使提交按钮是否生效


function check_data(){


if(flag[0]==1 && flag[1]==1 && flag[2]==1 && flag[3]==1 && flag[4]==1 && flag[5]==1){


$("input")[8].disabled=false;


            }   

else{


$("input")[8].disabled=true;


            }   
        }   

//--------------------------------------------------------------------  

var flag=[0,0,0,0,0,0];


var $=function(tagName){


return document.getElementsByTagName(tagName);


        }

//----------接受协议


function accept_info(){


flag[0]=1;


check_data();


        }

//----------拒绝协议


function refuse_info(){


flag[0]=0;


check_data();


        }

//----------重置


function reset_info(){


var info=["支持汉字,单词,数字,敏感字符屏蔽","密码在6-16位之间,敏感字符屏蔽","","email是联系重要手段","看不清楚?请点击验证码刷新"]


for(var i=0;i<$("span").length;i++){


$("span")[i].innerHTML=info[i];


flag[i]=0;


            }

for(var i=0;i<$("input").length-3;i++){


$("input")[i].value="";


            }

check_data();


        }

//----------邮箱检测


function check_email(email){


var reEmail=/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;


var b_email=reEmail.test(email);


if(b_email){


$("span")[3].innerHTML=" 邮箱可用";


flag[1]=1;


check_data();


            }

else{


$("span")[3].innerHTML=" 邮箱错误";


flag[1]=0;


check_data();


            }
        }

//----------密码检测


function check_password(obj){


var pwd=$("input")[1].value;


var reChinese=/[\u0391-\uFFE5]+/;


var b_chinese=reChinese.test(pwd);


var reSpace=/\s+/;


var b_space=reSpace.test(pwd);


//-------长度测试


if(pwd.length<6){


$("span")[1].innerHTML=" 密码长度不能小于6";


flag[2]=0;


check_data();


            }

//-------合法性检测:不能包含汉字


else if(b_chinese){


$("span")[1].innerHTML=" 密码不能包含中文";


flag[2]=0;


check_data();


            }

//-------合法性检测:不能包含空格


else if(b_space){


$("span")[1].innerHTML=" 密码不能包含空格";


flag[2]=0;


check_data();


            }

//-------合法时显示密码强度


else{


//定义对应的消息提示


var num=getResult(pwd);


var msg=new Array(" 密码强度差"," 密码强度一般"," 密码强度强壮");


$("span")[1].innerHTML=msg[num];


if($("input")[2].value!=""){


check_pw();


                    }

return flag[2]=1;


check_data();


                }
            }

//定义检测函数,返回0/1/2分别代表差/一般/强


function getResult(s){


var ls =-1;


if (s.match(/[a-z]/ig)){


ls++;


                }

if (s.match(/[0-9]/ig)){


ls++;


                }

if (s.match(/(.[^a-z0-9])/ig)){


ls++;


                }

return ls;


            }

//---------密码一致性检测


function check_pw(){


var pwd=$("input")[1].value.toString();


var check_pwd=$("input")[2].value.toString();


if(flag[2]==1){


if(pwd==check_pwd){


$("span")[2].innerHTML=" 密码可以使用";


flag[3]=1;


check_data();


                    }

else{


$("span")[2].innerHTML=" 两次密码不相同";


flag[3]=0;


check_data();


                    }
                }
            }

//---------用户名合法性检测


function check_id(id_name){//只能字母和数字,是否相同用AJAX判断


var reId=/^[\w\u0391-\uFFE5]+$/;


var b_id=reId.test(id_name);


if(!b_id){


$("span")[0].innerHTML=" ID命名非法";


flag[4]=0;


check_data();


                }

else{//合法用户名用ajax的checkid()检测是否被注册过


checkid(id_name);


                }
            }

//---------检查数据,使提交按钮是否生效


function check_data(){


if(flag[0]==1 && flag[1]==1 && flag[2]==1 && flag[3]==1 && flag[4]==1 && flag[5]==1){


$("input")[8].disabled=false;


                }

else{


$("input")[8].disabled=true;


                }
            }

    //--------------------------------------------------------------------

AJAX异步通信实现

3. ajax.js view plaincopy to clipboardprint?


function checkcode(regcode){


var xmlhttp;


try{


xmlhttp=new XMLHttpRequest();


        }   

catch(e){


xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");


        }   

xmlhttp.onreadystatechange=function(){


if (xmlhttp.readyState==4){


if (xmlhttp.status==200){


var data=xmlhttp.responseText;


code_result(data);


            }   

else{


$("span")[4].innerHTML="验证码校验失败,请联系管理员";


            }   
        }   

else{


$("span")[4].innerHTML="正在进行验证码校验...";


        }   
    }   

xmlhttp.open("post", "check_code.asp", true);


xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');


xmlhttp.send("regcode="+escape(regcode));


}   

function code_result(data){


var resultbox=$("span")[4];


if(data==1){


resultbox.innerHTML='<IMG src="yesok.gif"> 验证码正确';


flag[5]=1;


check_data();


        }   

else{


resultbox.innerHTML='<IMG src="yesno.gif"> 验证码错误';


flag[5]=0;


check_data();


        }   
}   

//--------------------------------------------------------------------   

function checkid(regid){


var xmlhttp;


try{


xmlhttp=new XMLHttpRequest();


        }   

catch(e){


xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");


        }   

xmlhttp.onreadystatechange=function(){


if (xmlhttp.readyState==4){


if (xmlhttp.status==200){


var data=xmlhttp.responseText;


id_result(data);


            }   

else{


$("span")[0].innerHTML="用户名检测失败,请联系管理员";


            }   
        }   

else{


$("span")[0].innerHTML="正在进行用户名校验...";


        }   
    }   

xmlhttp.open("post", "check_id.asp", true);


xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');


xmlhttp.send("regid="+escape(regid));


}   

function id_result(data){


var resultbox=$("span")[0];


if(data==1){


resultbox.innerHTML='<IMG src="yesok.gif"> 用户名可用';


flag[4]=1;


check_data();


        }   

else{


resultbox.innerHTML='<IMG src="yesno.gif"> 该用户名已经被注册';


flag[4]=0;


check_data();


    }   
}   

//--------------------------------------------------------------------   

function sendinfo(regname,pwd,email){


var xmlhttp;


try{


xmlhttp=new XMLHttpRequest();


        }   

catch(e){


xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");


        }   

xmlhttp.onreadystatechange=function(){


if (xmlhttp.readyState==4){


if (xmlhttp.status==200){


var data=xmlhttp.responseText;


reg_result(data);


            }   

else{


$("span")[5].innerHTML="注册失败,请联系管理员";


            }   
        }   

else{


$("span")[5].innerHTML="正在进行用户名注册...";


        }   
    }   

xmlhttp.open("post", "reg.asp", true);


xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');


xmlhttp.send("regname="+escape(regname)+"&pwd="+escape(pwd)+"&email="+escape(email));


}   

function reg_result(data){


if(data==1){


$("span")[5].innerHTML='<A href="http://cceer.xmu.edu.cn/blog/" target=_blank>'+$("input")[0].value+",您好.请点击这里登陆</A>";


        }   

else{


$("span")[5].innerHTML="注册失败,请联系管理员";


    }   
    }  

*这里是所有文件的打包下载(包括所有文件,图片,数据库等,解压后请在IIS下测试)


良好体验度的注册系统.rar

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章