动手实现随机验证码 首先,来写一个画验证码图片的Java类: packagecom.XiongYi.validationCode;importjava.awt.Color;importjava.awt.Font;importjava.awt.Graphics;importjava.awt.image.BufferedImage;importjava.io.IOException;importjava.io.OutputStream;importjava.util.Random;importjavax.imageio.ImageIO;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;publicclassValidationCodeextendsHttpServlet...{publicstaticStringgetValidationCodes(OutputStreamos)...{charcodeTable[]=...{'a','b','c','d','e','f','g','h','i','j','k','l','m','n','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z','1','2','3','4','5','6','7','8','9'};//判断时大小写不区分,另外,没有使用'O'和'0',也是怕混淆的麻烦BufferedImageimage=newBufferedImage(60,20,BufferedImage.TYPE_INT_RGB);//生成60×20的RGB图片Graphicsgraphic=image.getGraphics();//背景色graphic.setColor(newColor(0xDCDCDC));graphic.fillRect(0,0,60,20);charcodes[]=newchar[4];//随机产生验证码for(inti=0;i<=3;i++)...{codes[i]=codeTable[(int)(codeTable.length*Math.random())];}//把字画上去graphic.setColor(Color.BLACK);graphic.setFont(newFont("Arial",Font.BOLD,16));for(inti=0;i<=3;i++)...{graphic.drawChars(codes,i,1,2+15*i,15+i);//把codes[i]画到坐标为[10+5*i,15+i]的地方去}//15个干扰点Randomrand=newRandom();for(inti=0;i<15;i++)graphic.drawOval(rand.nextInt(60),rand.nextInt(20),1,1);//释放此图形的上下文并释放它所使用的所有系统资源graphic.dispose();try...{ImageIO.write(image,"JPEG",os);}catch(IOExceptione)...{e.printStackTrace();}returnnewString(codes,0,codes.length);}publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException...{doPost(request,response);}publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException...{request.getSession().setAttribute("validationCodes",getValidationCodes(response.getOutputStream()));}} 然后,写一个Servlet将生成的图片写入页面: packagecom.XiongYi.servlet;importjava.io.IOException;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importcom.XiongYi.validationCode.ValidationCode;publicclassValidationServletextendsHttpServlet...{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException...{doPost(request,response);}publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException...{Stringstr=ValidationCode.getValidationCodes(response.getOutputStream());request.getSession().setAttribute("validationCodes",str);}} 接着,在login.jsp中加入如下表单: <%...Stringpath=request.getContextPath();StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><formaction="<%=basePath+"servlet/LoginServlet"%>"><imgsrc="<%=basePath+"servlet/ValidationServlet"%>"/><br><inputtype="text"name="codes"/><inputtype="submit"/></form> 再写进行后台判断的Servlet: packagecom.XiongYi.servlet;importjava.io.IOException;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;publicclassLoginServletextendsHttpServlet...{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException...{doPost(request,response);}publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException...{if(request.getSession().getAttribute("validationCodes").toString().toLowerCase().equals(request.getParameter("codes").toString().toLowerCase()))response.getOutputStream().println("Right!");elseresponse.getOutputStream().println("Wrong!");}}