仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 538|回复: 11
打印 上一主题 下一主题

[学习教程] 来看Java完成随机考证码功效实例

[复制链接]
小妖女 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:14:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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的这个例子好像就是为了教学而写的,很多教学目的的例子是不考虑优化、性能的。
乐观 该用户已被删除
沙发
发表于 2015-1-20 18:18:51 | 只看该作者
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
admin 该用户已被删除
板凳
发表于 2015-1-24 12:28:10 | 只看该作者
还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
爱飞 该用户已被删除
地板
发表于 2015-2-1 10:39:47 | 只看该作者
Java 编程语言的风格十分接近C、C++语言。
简单生活 该用户已被删除
5#
发表于 2015-2-7 03:39:24 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
分手快乐 该用户已被删除
6#
发表于 2015-2-8 06:24:03 | 只看该作者
是一种语言,用以产生「小应用程序(Applet(s))
若相依 该用户已被删除
7#
发表于 2015-2-9 16:25:33 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
精灵巫婆 该用户已被删除
8#
发表于 2015-2-11 03:23:45 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
透明 该用户已被删除
9#
发表于 2015-3-1 20:29:28 | 只看该作者
Java 编程语言的风格十分接近C、C++语言。
谁可相欹 该用户已被删除
10#
发表于 2015-3-4 19:11:44 | 只看该作者
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
第二个灵魂 该用户已被删除
11#
发表于 2015-3-11 20:44:38 | 只看该作者
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
若天明 该用户已被删除
12#
发表于 2015-3-27 23:11:27 | 只看该作者
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-24 01:41

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表