java实现简单的验证码功能
最近要做一个网站,要求实现验证码程序,经过不断调试,终于成功实现功能。
一、验证码生成类
生成验证码的话需要用到java的Graphics类库,画出一个验证码
废话不多说,直接上代码
packageverificationCode; importjava.awt.Color; importjava.awt.Font; importjava.awt.Graphics; importjava.awt.image.BufferedImage; importjava.awt.image.RenderedImage; importjava.io.File; importjava.io.FileNotFoundException; importjava.io.FileOutputStream; importjava.io.IOException; importjava.io.OutputStream; importjava.util.HashMap; importjava.util.Map; importjava.util.Random; importjavax.imageio.ImageIO; publicclassgenerateCode{ privatestaticintwidth=150;//定义图片的width privatestaticintheight=48;//定义图片的height privatestaticintcodeCount=4;//定义图片上显示验证码的个数 privatestaticintxx=25; privatestaticintfontHeight=42; privatestaticintcodeY=42; privatestaticchar[]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'}; /** *生成一个map集合 *code为生成的验证码 *codePic为生成的验证码BufferedImage对象 *@return */ publicstaticMapgenerateCodeAndPic(){ //定义图像buffer BufferedImagebuffImg=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //Graphics2Dgd=buffImg.createGraphics(); //Graphics2Dgd=(Graphics2D)buffImg.getGraphics(); Graphicsgd=buffImg.getGraphics(); //创建一个随机数生成器类 Randomrandom=newRandom(); //将图像填充为白色 gd.setColor(Color.WHITE); gd.fillRect(0,0,width,height); //创建字体,字体的大小应该根据图片的高度来定。 Fontfont=newFont("Fixedsys",Font.BOLD,fontHeight); //设置字体。 gd.setFont(font); //画边框。 gd.setColor(Color.BLACK); gd.drawRect(0,0,width-1,height-1); gd.setFont(font); //随机产生40条干扰线,使图象中的认证码不易被其它程序探测到。 intred=0,green=0,blue=0; //randomCode用于保存随机产生的验证码,以便用户登录后进行验证。 StringBufferrandomCode=newStringBuffer(); //随机产生codeCount数字的验证码。 for(inti=0;i map=newHashMap (); //存放验证码 map.put("code",randomCode); //存放生成的验证码BufferedImage对象 map.put("codePic",buffImg); returnmap; } publicstaticvoidmain(String[]args)throwsException{ //创建文件输出流对象 Filefile=newFile("WebRoot/image/"+System.currentTimeMillis()+".jpg"); FileOutputStreamout=null; try{ if(!file.exists()){ //先得到文件的上级目录,并创建上级目录,在创建文件 file.getParentFile().mkdir(); file.createNewFile(); } out=newFileOutputStream(file); Map map=generateCode.generateCodeAndPic(); ImageIO.write((RenderedImage)map.get("codePic"),"jpeg",out); System.out.println("验证码的值为:"+map.get("code")); }catch(FileNotFoundExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); } } }
二、验证码验证类
packageverificationCode; importjava.io.IOException; importjavax.servlet.ServletException; importjavax.servlet.annotation.WebServlet; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importjavax.servlet.http.HttpSession; @WebServlet("/checkCode") publicclasscheckCodeextendsHttpServlet{ privatestaticfinallongserialVersionUID=1L; protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ } protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ Stringcode=request.getParameter("code"); response.setCharacterEncoding("utf-8");//保证格式正确 response.setContentType("text/html"); //验证验证码 StringsessionCode=request.getSession().getAttribute("code").toString(); if(code!=null&&!"".equals(code)&&sessionCode!=null&&!"".equals(sessionCode)){ if(code.equalsIgnoreCase(sessionCode)){ response.getWriter().println("验证通过!"); }else{ response.getWriter().println("验证失败!"); } }else{ response.getWriter().println("验证失败!"); } } }
三、验证码传输类
用到doget方法
packageverificationCode; importjava.awt.Color; importjava.awt.Font; importjava.awt.Graphics; importjava.awt.image.BufferedImage; importjava.awt.image.RenderedImage; importjava.io.IOException; importjava.util.HashMap; importjava.util.Map; importjava.util.Random; importjavax.imageio.ImageIO; importjavax.servlet.ServletException; importjavax.servlet.ServletOutputStream; importjavax.servlet.annotation.WebServlet; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importjavax.servlet.http.HttpSession; importverificationCode.generateCode; /** *ServletimplementationclassCodeServlet */ @WebServlet("/getCode") publicclassCodeServletextendsHttpServlet{ privatestaticfinallongserialVersionUID=1L; protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{ //调用工具类生成的验证码和验证码图片 MapcodeMap=generateCode.generateCodeAndPic(); //将四位数字的验证码保存到Session中。 HttpSessionsession=req.getSession(); session.setAttribute("code",codeMap.get("code").toString()); //禁止图像缓存。 resp.setHeader("Pragma","no-cache"); resp.setHeader("Cache-Control","no-cache"); resp.setDateHeader("Expires",0); resp.setContentType("image/jpeg"); //将图像输出到Servlet输出流中。 ServletOutputStreamsos; try{ sos=resp.getOutputStream(); ImageIO.write((RenderedImage)codeMap.get("codePic"),"jpeg",sos); sos.close(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } }
四、jsp验证demo
<%@pagelanguage="java"contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>验证码页面 请输入验证码:
总结
虽然只是一个小小的demo,但是实际上用到了许多知识,比如生成验证码的画图,传输验证码doget,验证验证码的dopost和ajax动态更换验证码,麻雀虽小五脏俱全啊。
参考网址:Java实现验证码的产生和验证
更多关于java验证码的精彩文章请点击专题:java验证码大全进行参考
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。