|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
先说优点,首先和C,C++这些语言比起来,java很简单,去掉指针的java,非常好理解,自动垃圾回收机制也很好,自从JDK1.5推出以后,性能上又有了很大提高。
如今很多体系的注册、登录大概公布信息模块都增加的随机码功效,就是为了不主动注册程序大概主动公布程序的利用。
考证码实践上就是随机选择一些字符以图片的情势展示在页面上,假如举行提交操纵的同时必要将图片上的字符同时提交,假如提交的字符与服务器session保留的分歧,则以为提交信息有效。为了不主动程序剖析剖析图片,一般会在图片上随机天生一些搅扰线大概将字符举行歪曲,增添主动辨认的难度。
在这里,我们利用servlet来完成随机考证码的完成。
packagecom.servlet;
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;
/**
*天生随机考证码
*@authorbitiliu
*
*/
publicclassValidateCodeServletextendsHttpServlet
{
privatestaticfinallongserialVersionUID=1L;
//考证码图片的宽度。
privateintwidth=60;
//考证码图片的高度。
privateintheight=20;
//考证码字符个数
privateintcodeCount=4;
privateintx=0;
//字体高度
privateintfontHeight;
privateintcodeY;
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)
{}
x=width/(codeCount+1);
fontHeight=height-2;
codeY=height-4;
}
protectedvoidservice(HttpServletRequestreq,HttpServletResponseresp)
throwsServletException,java.io.IOException{
//界说图象buffer
BufferedImagebuffImg=newBufferedImage(
width,height,BufferedImage.TYPE_INT_RGB);
Graphics2Dg=buffImg.createGraphics();
//创立一个随机数天生器类
Randomrandom=newRandom();
//将图象添补为红色
g.setColor(Color.WHITE);
g.fillRect(0,0,width,height);
//创立字体,字体的巨细应当依据图片的高度来定。
Fontfont=newFont("Fixedsys",Font.PLAIN,fontHeight);
//设置字体。
g.setFont(font);
//画边框。
g.setColor(Color.BLACK);
g.drawRect(0,0,width-1,height-1);
//随机发生160条搅扰线,使图像中的认证码不容易被别的程序探测到。
g.setColor(Color.BLACK);
for(inti=0;i<160;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<codeCount;i++){
//失掉随机发生的考证码数字。
StringstrRand=String.valueOf(codeSequence[random.nextInt(36)]);
//发生随机的色彩份量来机关色彩值,如许输入的每位数字的色彩值都将分歧。
red=random.nextInt(255);
green=random.nextInt(255);
blue=random.nextInt(255);
//用随机发生的色彩将考证码绘制到图象中。
g.setColor(newColor(red,green,blue));
g.drawString(strRand,(i+1)*x,codeY);
//将发生的四个随机数组合在一同。
randomCode.append(strRand);
}
//将四位数字的考证码保留到Session中。
HttpSessionsession=req.getSession();
session.setAttribute("validateCode",randomCode.toString());
//克制图象缓存。
resp.setHeader("Pragma","no-cache");
resp.setHeader("Cache-Control","no-cache");
resp.setDateHeader("Expires",0);
resp.setContentType("image/jpeg");
//将图象输入到Servlet输入流中。
ServletOutputStreamsos=resp.getOutputStream();
ImageIO.write(buffImg,"jpeg",sos);
sos.close();
}
}
<p>
专门做了这个例子;而java的这个例子好像就是为了教学而写的,很多教学目的的例子是不考虑优化、性能的。 |
|