验证码代码学习.docx

上传人:b****6 文档编号:5399434 上传时间:2022-12-15 格式:DOCX 页数:9 大小:17.38KB
下载 相关 举报
验证码代码学习.docx_第1页
第1页 / 共9页
验证码代码学习.docx_第2页
第2页 / 共9页
验证码代码学习.docx_第3页
第3页 / 共9页
验证码代码学习.docx_第4页
第4页 / 共9页
验证码代码学习.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

验证码代码学习.docx

《验证码代码学习.docx》由会员分享,可在线阅读,更多相关《验证码代码学习.docx(9页珍藏版)》请在冰豆网上搜索。

验证码代码学习.docx

验证码代码学习

<%@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);

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 小学教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1