验证码技术的实现按如下步骤:1、设计一个验证码生成类RandomImageGenerator.javaimport java.awt.*;import java.awt.image.*;import java.io.*;import javax.imageio.ImageIO;public class RandomImageGenerator {final static int LENGTH=4;static Colorcolors[]={Color.red,Color.black,Color.blue,Color.pink,Color.cyan};public static String random() {//创建一个4位的验证码字符串Stringstr="1234567890ABCDEFGHIJKLMNOPORSTUVWXYZabcefghijklmnopqrstuvwxyz",r and="";java.util.Random random=new java.util.Random();for(int i=0;i<LENGTH;i++) {intindex=random.nextInt(str.length());rand+=str.substring(index,index+1);}return rand;}public static void render(String num,OutputStream out) throws IOException {//创建一幅含有验证码的干扰图象,送输出流if (num.length()!=LENGTH)throw new IllegalArgumentException("验证码长度不足");int height=30;int width=(height-10)*LENGTH;BufferedImage bi=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);Graphics2D g=(Graphics2D)bi.getGraphics();java.util.Random random=new java.util.Random();g.setColor(Color.white);g.fillRect(0,0,width,height);Font mFont=new Font("宋体",Font.BOLD+Font.ITALIC,height-5);g.setFont(mFont);FontMetrics fm=g.getFontMetrics();//画干扰点for(int i=0;i<200;i++) {int x=random.nextInt(width);int y=random.nextInt(height);Color color1=newColor(random.nextInt(255),random.nextInt(255),random.nextInt(255));g.setColor(color1);g.drawOval(x,y,0,0);}//画干扰线for(int i=0;i<5;i++) {int x=0;int y=random.nextInt(height);int x1=width;int y1=random.nextInt(height);Color color1=newColor(random.nextInt(255),random.nextInt(255),random.nextInt(255));g.setColor(color1);g.drawLine(x,y,x1,y1);}//显示验证码字符char str[]=num.toCharArray();for(int i=0,x=0,y=0;i<str.length;i++) {y=height-fm.getDescent();if (i%2==0){y-=10;}g.setColor(colors[random.nextInt(color s.length)]);g.drawChars(str,i,1,x,y);x+=fm.charWidth(str[i])+5;}g.dispose();ImageIO.write(bi,"jpg",out);}}2.使用Servlet程序来实现验证码在页面中使用这个Servlet程序,显示验证码图案。
import javax.servlet.*;import javax.servlet.http.*;import java.io.*;public class RandomImageServlet extends HttpServlet {public final static StringRANDOM_LOGIN_KEY="RANDOM_LOGIN_KEY";public void init() throws ServletException {System.setProperty("java.awt.headless","true" );//设置一个系统属性}public String getRandomLoginKey(HttpServletRequest request){return(String)request.getSession().getAttribute(RANDOM_LOGIN_KEY);}protected void doGet(HttpServletRequestrequest,HttpServletResponse response)throwsServletException,IOException {HttpSession session=request.getSession();if (session!=null){StringrandomString=RandomImageGenerator.random();//得到一个6位的验证码字符串session.setAttribute(RANDOM_LOGIN_KEY , randomString);//验证码保存到session中response.setContentType("image/jpeg") ;//设置响应类型为jpeg类型response.setHeader("Pragma","No-cache ");//设置响应不采用缓冲response.setHeader("Cache-Control","n o-cache");//设置响应不采用缓冲response.setDateHeader("Expires", 0);//设置响应不采用缓冲RandomImageGenerator.render(randomStr ing,response.getOutputStream());}}protected void doPost(HttpServletRequestrequest,HttpServletResponseresponse) throws ServletException,IOException {doGet(request,response);}}在WEB-INF/web.xml中配置这个Servlet程序:<servlet><servlet-name>image</servlet-name><servlet-class>ch17.RandomImageServlet</servlet-class ></servlet><servlet-mapping><servlet-name>image</servlet-name><url-pattern>/verifyCode.jsp</url-pattern></servlet-mapping>3.JSP页面实现testRandom.jsp<script type="text/javascript" language="javascript">function Check() {if (document.register.random.value==""){window.alert("请填写验证码!");document.register.random.focus();return false;}document.register.submit();}function reloadImage(url){document.register.img1.src = url;}</script><form name="register" method="post" action=""><table cellpadding="0" cellspacing="0"><tr><td><div align="right" class="style2"><strong>验证码</strong></div></td><td><div align="center"><input name="random" type="text" id="random"></div></td><td><img name="img1" src="./verifycode.jsp" width="100" height="20" border="1" align="absmiddle"><ahref="JavaScript:reloadImage('./verifyCode.jsp');"><font size="2">看不清楚,换一张</font></a></td></tr><tr><td></td><td></td><td><input type="button" name="Submit" value="登录" onclick="Check()"><td></tr></table></form>在Eclipse按上述步骤完成后,点击“运行”,界面上验证码图标总是显示不出来,出现一把叉,究竟是什么原因,在网上查找了很久,大多数都说是要下载类似flash插件,或者是Cookie禁用等方法,我按网上的方法改来改去,最后都是不行,最后我把web.xml里的配置一个一个重新加进去,发现,竟然是在。