Java动态验证码单线设计的两种方法
1.java的动态验证码我这里将介绍两种方法:
一:根据java本身提供的一种验证码的写法,这种呢只限于大家了解就可以了,因为java自带的模式编写的在实际开发中是没有意义的,所以只供学习一下就可以了,待会讲解的第二种呢就是我们需要掌握的一种模式了:
第一种的代码如下:
importjava.awt.Color; importjava.awt.Font; importjava.awt.Graphics; importjava.awt.image.BufferedImage; importjava.io.IOException; importjava.util.Random; importjavax.imageio.ImageIO; importjavax.servlet.ServletException; importjavax.servlet.annotation.WebServlet; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importjavax.servlet.http.HttpSession; /** *Servletimplementationclassinde */ @WebServlet("/inde") publicclassindeextendsHttpServlet{ privatestaticfinallongserialVersionUID=1L; /** *@seeHttpServlet#HttpServlet() */ publicinde(){ super(); //TODOAuto-generatedconstructorstub } /** *@seeHttpServlet#doGet(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ this.doPost(request,response); } /**动态生成图片验证码 *@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub //创建图像 intwidth=100; intheight=40; //图片的大小设置 BufferedImageimage=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //创建画板 Graphicsg=image.getGraphics(); setSquareBackGround(g,width,height,5); //确定画笔颜色 g.setColor(Color.black); //填充矩形 g.fillRect(0,0,width,height); //在大矩形中放小矩形 g.setColor(Color.WHITE); g.fillRect(1,1,width-2,height-2); //填充字符 Stringstr="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789"; StringBuffersb=newStringBuffer(); //画随机干扰框 setSquareBackGround(g,width,height,3); //画干扰点 CreateRandomPoint(width,height,100,g,100); //随机画几条线 CreateRandomLine(width,height,8,g,100); //随机获取4个字符 Randomrandom=newRandom(); for(inti=0;i<4;i++){ //62个填充字符里面随机的随机的收取字符 intindex=random.nextInt(62); //截取一个字符 Stringst=str.substring(index,index+1); //把字符放到图片中去 g.setColor(Color.red); //设置字体 g.setFont(newFont("宋体",Font.BOLD,30)); g.drawString(st,20*i,30);//防止4个字符在一起 sb.append(st); } //把StringBuffer中的验证码放到session里面,目的是让Login调用 HttpSessionse=request.getSession(); se.setAttribute("number",sb.toString()); //发送图片到浏览器指定发送的图片和格式 response.setContentType("image/jpeg"); //图片,图片的格式,输出的方式 ImageIO.write(image,"jpg",response.getOutputStream()); } Randomrand=newRandom(); privatevoidCreateRandomPoint(intwidth,intheight,intmany,Graphicsg,intalpha) {//随机产生干扰点 for(inti=0;i上面的代码呢写的很详细了,这里我就不重复了,这里的干扰线条是有很多写法的,我这里就没有全写出来,有需要的话可以私聊我哦!
下面介绍第二种:
这种呢是我们开发中是可以用得到的,使用在的是网页端的交互,我们在登录网站的时候有很多的验证码就可以用这个来写了
importjava.io.IOException; importjava.util.Random; importjavax.imageio.ImageIO; importjavax.servlet.ServletException; importjavax.servlet.annotation.WebServlet; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importjavax.servlet.http.HttpSession; /** *Servletimplementationclassinde */ @WebServlet("/inde") publicclassindeextendsHttpServlet{ privatestaticfinallongserialVersionUID=1L; /** *@seeHttpServlet#HttpServlet() */ publicinde(){ super(); //TODOAuto-generatedconstructorstub } /** *@seeHttpServlet#doGet(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ this.doPost(request,response); } /**动态生成图片验证码 *@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub //创建图像 intwidth=100; intheight=40; //图片的大小设置 BufferedImageimage=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //创建画板 Graphicsg=image.getGraphics(); setSquareBackGround(g,width,height,5); //确定画笔颜色 g.setColor(Color.black); //填充矩形 g.fillRect(0,0,width,height); //在大矩形中放小矩形 g.setColor(Color.WHITE); g.fillRect(1,1,width-2,height-2); //填充字符 Stringstr="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789"; StringBuffersb=newStringBuffer(); //随机获取4个字符 Randomrandom=newRandom(); for(inti=0;i<4;i++){ //62个填充字符里面随机的随机的收取字符 intindex=random.nextInt(62); //截取一个字符 Stringst=str.substring(index,index+1); //把字符放到图片中去 g.setColor(Color.red); //设置字体 g.setFont(newFont("宋体",Font.BOLD,30)); g.drawString(st,20*i,30);//防止4个字符在一起 sb.append(st); } //把StringBuffer中的验证码放到session里面,目的是让Login调用 HttpSessionse=request.getSession(); se.setAttribute("number",sb.toString()); //发送图片到浏览器指定发送的图片和格式 response.setContentType("image/jpeg"); //图片,图片的格式,输出的方式 ImageIO.write(image,"jpg",response.getOutputStream()); }这样就可以运行了,当然了我们可以在这里面加入第一种的干扰模块给拿过来这样就可以实现整体的一个效果了。
总结
以上所述是小编给大家介绍的Java动态验证码单线设计的两种方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!