验证码代码学习.docx
《验证码代码学习.docx》由会员分享,可在线阅读,更多相关《验证码代码学习.docx(9页珍藏版)》请在冰豆网上搜索。
验证码代码学习
<%@pagecontentType="text/html;charset=UTF-8"
import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*"%>
<%!
ColorgetRandColor(intfc,intbc)
{//给定范围获得随机颜色
Randomrandom=newRandom();
if(fc>255)
fc=255;
if(bc>255)
bc=255;
intr=fc+random.nextInt(bc-fc);
intg=fc+random.nextInt(bc-fc);
intb=fc+random.nextInt(bc-fc);
returnnewColor(r,g,b);
}%>
<%
//设置页面不缓存
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires",0);
//在内存中创建图象
intwidth=60,height=20;
BufferedImageimage=newBufferedImage(width,height,
BufferedImage.TYPE_INT_RGB);
//获取图形上下文
Graphicsg=image.getGraphics();
//生成随机类
Randomrandom=newRandom();
//设定背景色
g.setColor(getRandColor(200,250));
g.fillRect(0,0,width,height);
//设定字体
g.setFont(newFont("TimesNewRoman",Font.PLAIN,18));
//画边框
//g.setColor(newColor());
g.drawRect(0,0,width-1,height-1);
//随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
g.setColor(getRandColor(160,200));
for(inti=0;i<155;i++){
intx=random.nextInt(width);
inty=random.nextInt(height);
intxl=random.nextInt(12);
intyl=random.nextInt(12);
g.drawLine(x,y,x+xl,y+yl);
}
//取随机产生的认证码(4位数字)
StringsRand="";
for(inti=0;i<4;i++){
Stringrand=String.valueOf(random.nextInt(10));
sRand+=rand;
//将认证码显示到图象中
g.setColor(newColor(20+random.nextInt(110),20+random
.nextInt(110),20+random.nextInt(110)));
//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
g.drawString(rand,13*i+6,16);
}
//将认证码存入SESSION
session.setAttribute("validCode",sRand);
//图象生效
g.dispose();
//输出图象到页面
ImageIO.write(image,"JPEG",response.getOutputStream());
//response.getOutputStream()和~Response.getWriter相冲突
//会抛出java.lang.IllegalStateException:
//getOutputStream()hasalreadybeencalledforthisresponse
//所以一定要加入下面这两行
out.clear();
out=pageContext.pushBody();
%>
上面是jsp页面中的验证码
下面是servlet中的验证码
Javacode
packagecomm;
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics2D;
importjava.awt.image.BufferedImage;
importjava.util.Random;
importjavax.imageio.ImageIO;
importjavax.servlet.ServletException;
importjavax.servlet.ServletOutputStream;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjavax.servlet.http.HttpSession;
publicclassImageServletextendsHttpServlet{
privatestaticfinallongserialVersionUID=1L;
//验证码值
privatestaticStringvalue;
//验证码图片的宽度。
privateintwidth=63;
//验证码图片的高度。
privateintheight=20;
//验证码字符个数
privateintcodeCount=4;
//字体高度
privateintfontHeight;
//验证码随机数字
char[]codeSequence={'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'};
/**
*初始化验证图片属性
*/
publicvoidinit()throwsServletException{
//从web.xml中获取初始信息
//宽度
StringstrWidth=this.getInitParameter("width");
//高度
StringstrHeight=this.getInitParameter("height");
//字符个数
StringstrCodeCount=this.getInitParameter("codeCount");
//将配置的信息转换成数值
try{
if(strWidth!
=null&&strWidth.length()!
=0){
width=Integer.parseInt(strWidth);
}
if(strHeight!
=null&&strHeight.length()!
=0){
height=Integer.parseInt(strHeight);
}
if(strCodeCount!
=null&&strCodeCount.length()!
=0){
codeCount=Integer.parseInt(strCodeCount);
}
}catch(NumberFormatExceptione){
}
fontHeight=height-2;
}
protectedvoidservice(HttpServletRequestreq,HttpServletResponseresp)
throwsServletException,java.io.IOException{
HttpSessionsession=req.getSession();
//定义图像buffer
BufferedImagebuffImg=newBufferedImage(width,height,
BufferedImage.TYPE_INT_RGB);
Graphics2Dg=buffImg.createGraphics();
//创建一个随机数生成器类
Randomrandom=newRandom();
//将图像填充随即背景颜色(指定范围)
g.setColor(getRandColor(200,250));
g.fillRect(0,0,width,height);
//创建字体,字体的大小应该根据图片的高度来定。
Fontfont=newFont("Fixedsys",Font.PLAIN,fontHeight);
//设置字体。
g.setFont(font);
//画边框。
g.drawRect(0,0,width-1,height-1);
//随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
g.setColor(getRandColor(160,200));
for(inti=0;i<155;i++){
intx=random.nextInt(width);
inty=random.nextInt(height);
intxl=random.nextInt(12);
intyl=random.nextInt(12);
g.drawLine(x,y,x+xl,y+yl);
}
//randomCode用于保存随机产生的验证码,以便用户登录后进行验证。
StringBufferrandomCode=newStringBuffer();
intred=0,green=0,blue=0;
//随机产生codeCount数字的验证码。
for(inti=0;i//得到随机产生的验证码数字。
StringstrRand=String.valueOf(codeSequence[random.nextInt(36)]);
//产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。
//用随机产生的颜色将验证码绘制到图像中。
g.setColor(newColor(20+random.nextInt(110),20+random
.nextInt(110),20+random.nextInt(110)));
g.drawString(strRand,13*i+6,16);
//将产生的四个随机数组合在一起。
randomCode.append(strRand);
}
//将四位数字的验证码保存到Session中。
session.setAttribute("validateCodeRecruit",randomCode.toString());
value=randomCode.toString();
//禁止图像缓存。
resp.setHeader("Pragma","no-cache");
resp.setHeader("Cache-Control","no-cache");
resp.setDateHeader("Expires",0);
resp.setContentType("image/jpeg");
//清空缓存
g.dispose();
//将图像输出到Servlet输出流中。
ServletOutputStreamsos=resp.getOutputStream();
ImageIO.write(buffImg,"jpeg",sos);
sos.close();
//前台js中无法或得最新的验证码,如果要在前台js中获得session中的最新验证码值,需要用ajax来得到最新的值
//页面加载的时候首先加载的是js代码,那时候session中值还没有更新,而js无法进入后台
}
//给定范围获得随机颜色
privatestaticRandomrandom=newRandom();
/**
*得到随即颜色(指定范围)
*@paramfc
*@parambc
*@return
*/
privateColorgetRandColor(intfc,intbc){
intinterval=fc;
if(fc>255){
fc=255;
}
if(bc>255){
bc=255;
}
intr=fc+random.nextInt(bc-interval);
intg=fc+random.nextInt(bc-interval);
intb=fc+random.nextInt(bc-interval);
returnnewColor(r,g,b);
}
/**
*ajax验证图片验证码(页面使用此验证图片验证码是否正确,返回Boolean)
*@paramimgvalue
*@return
*/
publicbooleangetValidateValue(Stringimgvalue){
//转换为统一的大写比较,用户可以不用管大小写
returnimgvalue.toUpperCase().equals(value);
}
}