使用Ajax进行验证码的刷新

利用Ajax实现验证码的刷新

废话不多说,大部分网站都有设置验证码防止恶意攻击。现在用最简单的实现进行我们的验证码刷新。

注册页面:login.jsp

<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>

<%

Stringpath=request.getContextPath();

StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">

<html>

<head>

<scriptsrc="../js/check_login.js"type="text/javascript"></script><!--这里的路径要这样设置-->

<basehref="<%=basePath%>">

<title>欢迎登陆</title>

<metahttp-equiv="pragma"content="no-cache">

<metahttp-equiv="cache-control"content="no-cache">

<metahttp-equiv="expires"content="0">

<metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">

<metahttp-equiv="description"content="Thisismypage">

<!--这里会需要引入外部的CSS文件,路径如下-->

<linkrel="stylesheet"type="text/css"href="CSS/style.css">

</head>

<styletype="text/css">

</style>

<body>

<divid="main">

<formmethod="post"action="user/checkUserLogin.jsp">

<tablealign="left">

<tr>

<td>用户名:</td>

<td><inputtype="text"name="username"id="username"onchange="returncheck_username()==true;"></td>

<td></td>

<td><divid="display_username"class="display"></div></td>

</tr>

<tr>

<td>密&nbsp;&nbsp;码:</td>

<td><inputtype="password"name="password"id="password"onchange="returncheck_password()==true"></td>

<td></td>

<td><divid="display_password"class="display"></div></td>

</tr>

<tr>

<td>验证码:</td>

<td><inputtype="text"name="certCode"maxlength="4"id="certCode"onchange="returncheck_certCode()==true;"></td>

<td><imgsrc="makeCertPic.jsp"id="img"title="refresh"name="img">

<ahref="JavaScript:reLoadImg();">换一张</a></td>

<td><divid="display_certCode"class="display"></div></td>

</tr>

<tr><td></td><td></td>

<td><fontsize="4"><inputtype="submit"value="登陆"></font></td></tr>

</table>

</form>

</div>

</body>

</html>

生成验证码图片:makeCertPic.jsp

<%@pagecontentType="image/jpeg"%>

<jsp:useBeanid="image"scope="page"class="util.makeCertPic"/>

<%

Stringstr=image.getCertPic(0,0,response.getOutputStream());

session.setAttribute("certCode",str);

out.clear();//该行及下一行代码可以解决respons.getOutputStream()hasalreadybeencalled的问题

out=pageContext.pushBody();

%>

生成验证码的类:makeCertPic.java

packageutil;

importjava.awt.Color;

importjava.awt.Font;

importjava.awt.Graphics;

importjava.awt.image.BufferedImage;

importjava.io.IOException;

importjava.io.OutputStream;

importjava.util.Random;

importjavax.imageio.ImageIO;

/**

*生成验证码图片

*/

publicclassmakeCertPic{

//验证码图片中可以出现的字符集,可根据需要修改

privatecharmapTable[]={

'a','b','c','d','e','f',

'g','h','i','j','k','l',

'm','n','o','p','q','r',

's','t','u','v','w','x',

'y','z','0','1','2','3',

'4','5','6','7','8','9'};

/**

*功能:生成彩色验证码图片

*参数width为生成的图片的宽度,参数height为生成的图片的高度,参数os为页面的输出流

*/

publicStringgetCertPic(intwidth,intheight,OutputStreamos){

if(width<=0)width=60;

if(height<=0)height=20;

BufferedImageimage=newBufferedImage(width,height,

BufferedImage.TYPE_INT_RGB);

//获取图形上下文

Graphicsg=image.getGraphics();

//设定背景色

g.setColor(newColor(0xDCDCDC));

g.fillRect(0,0,width,height);

//画边框

g.setColor(Color.black);

g.drawRect(0,0,width-1,height-1);

//取随机产生的认证码

StringstrEnsure="";

//4代表4位验证码,如果要生成更多位的认证码,则加大数值

for(inti=0;i<4;++i){

strEnsure+=mapTable[(int)(mapTable.length*Math.random())];

}

//将认证码显示到图象中,如果要生成更多位的认证码,增加drawString语句

g.setColor(Color.black);

g.setFont(newFont("AtlanticInline",Font.PLAIN,18));

Stringstr=strEnsure.substring(0,1);

g.drawString(str,8,17);

str=strEnsure.substring(1,2);

g.drawString(str,20,15);

str=strEnsure.substring(2,3);

g.drawString(str,35,18);

str=strEnsure.substring(3,4);

g.drawString(str,45,15);

//随机产生10个干扰点

Randomrand=newRandom();

for(inti=0;i<10;i++){

intx=rand.nextInt(width);

inty=rand.nextInt(height);

g.drawOval(x,y,1,1);

}

//释放图形上下文

g.dispose();

try{

//输出图象到页面

ImageIO.write(image,"JPEG",os);

os.flush();

os.close();

os=null;

}catch(IOExceptione){

return"";

}

returnstrEnsure;

}

}

以上代码网上有很多,但是要实现验证码图片的刷新及验证就需要用到以下的JS

Check_login.js

functioncheck_username()

{

varv=newArray();

varusername=document.getElementById("username").value;

//varreg=/[A-Za-z0-9]/;//正则表达式

varresult=username.replace(/(\s+$)|(^\s+)|\s/g,"");//去掉空格

varreg=/[\u4e00-\u9fa5]|\w/;//用户名可以为中文或英文及数字的组合

//for(vari=0;i<username.length;i++)

//{

//v[i]=document.getElementById("username").value[i];

//alert(v[i]);

//}

if(username.length>20||username.length<4)

{

document.getElementById("display_username").innerText="用户名的长度必须在4到20之间";

document.getElementById("username").value="";

document.getElementById("username").focus();

returnfalse;

}

returntrue;

}

functioncheck_password()

{

varpassword=document.getElementById("password").value;

if(password.length>25||password.length<6)

{

document.getElementById("display_password").innerText="密码的长度必须在6到25之间";

document.getElementById("password").value="";

document.getElementById("password").focus();

returnfalse;

}

returntrue;

}

//验证码的刷新(这里的刷新是指按换一张后的刷新,但页面本身不会刷新)

functionreLoadImg()

{

document.getElementById("img").src="makeCertPic.jsp?"+Math.random();

document.getElementById("display_certCode").value="";

document.getElementById("certCode").focus();

}

//从这里开始实现Ajax的无刷新技术

varXHR=null;//这里的XHR指的是XMLHttpRequest()的一个对象,但是现在先初始化为空

functioncheck_certCode()

{

varcertCode=document.getElementById("certCode").value;//先得到用户输入的验证码

if(window.ActiveXObject)//判断是否为IE浏览器

{

XHR=newActiveXObject("Microsoft.XMLHttpRequest");

}

elseif(window.XMLHttpRequest)//非IE浏览器

{

XHR=newXMLHttpRequest();

}

if(null!=XHR)

{

XHR.open("POST","user/checkCertCode.jsp",true);/*为同服务器间通信的对象做准备并初始化,第一个参数表示提交方式(POST或者GET),第二个参数表示提交的URL,第三个表示提交的是异步方式还是同步方式*/

XHR.onreadystatechange=ajaxRefresh;//将XHR的onreadystatechange事件处理函数赋给函数ajaxRefresh()

//alert(certCode);

XHR.setRequestHeader("content-type","application/x-www-form-urlencoded");//post方式的开头

XHR.send("certCode="+certCode);//Post方法发送参数,若为GET则为NULL

}

}

functionajaxRefresh()

{

if(XHR.readyState==4)//有1-4可选,1表示加载中,但未调用;2表示已加载,且调用了send方法,但头不可用;3表示交互,已收到部分数据,状态和响应头不可用,4表示完成

{

if(XHR.status==200)//OK

{

//alert("oh,yeah");

}

else

if(XHR.status==404)//服务器找不到URL

{

document.getElementById("display_certCode").innerText="验证码错误,请重新输入";//显示验证信息

document.getElementById("certCode").value="";//验证码置空

document.getElementById("certCode").focus();//焦点返回输入框

document.getElementById("img").src="makeCertPic.jsp?"+Math.random();

//刷新验证码

}

}

}

验证码URL:checkCertCode.jsp

<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>

<%

Stringpath=request.getContextPath();

StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">

<html>

<head>

<basehref="<%=basePath%>">

<title>MyJSP'checkCertCode.jsp'startingpage</title>

<metahttp-equiv="pragma"content="no-cache">

<metahttp-equiv="cache-control"content="no-cache">

<metahttp-equiv="expires"content="0">

<metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">

<metahttp-equiv="description"content="Thisismypage">

<!--

<linkrel="stylesheet"type="text/css"href="styles.css">

-->

</head>

<body>

<%

StringcertCode=request.getParameter("certCode");

System.out.println(certCode+"---checkCertCode");

System.out.println((String)session.getAttribute("certCode")+"---session");

if(certCode.equals((String)session.getAttribute("certCode")))

{

System.out.println("hello");//成功后没有操作,200

//request.getRequestDispatcher("/user/checkUserLogin.jsp").forward(request,response);

}

elseresponse.sendRedirect("/Error.jsp");//这里的Error.jsp是没有的,即为404

%>

</body>

</html>

相关推荐