posts - 0,  comments - 19,  trackbacks - 0
          java隨機(jī)產(chǎn)生驗(yàn)證碼,可以隨機(jī)生成數(shù)字、大寫字母、小寫字母。還可以隨機(jī)生成文字字體、及大小。在圖片上面可能字體都不不同、大小不等。

          import java.awt.Color;  
          import java.awt.Font;  
          import java.awt.Graphics;  
          import java.awt.image.BufferedImage;  
          import java.util.Random;  
            
          import javax.imageio.ImageIO;  
          import javax.servlet.http.HttpServletRequest;  
          import javax.servlet.http.HttpServletResponse;  
          /** 
           * <b>function:</b> 驗(yàn)證碼生成工具類 
           * @project NetWorkService 
           * @package com.hoo.util  
           * @fileName ValidCodeUtils.java 
           * @createDate 2010-8-3 下午03:05:50 
           * 
          @author hoojo 
           
          */  
          @SuppressWarnings(
          "unused")  
          public class ValidCodeUtils {  
              
          /********************************************************************* 
               * 驗(yàn)證碼寬度 
               
          */  
              
          public static int WIDTH = 60;  
              
          /**
               * 驗(yàn)證碼高度 
               
          */  
              
          public static int HEIGHT = 20;  
                
              
          /********************************************************************** 
               * 驗(yàn)證碼背景顏色COLOR_FC_BG 應(yīng)當(dāng)小于COLOR_BC_BG 
               
          */  
              
          public static int COLOR_FC_BG = 200;  
              
          /**
               * 驗(yàn)證碼背景顏色COLOR_FC_BG 應(yīng)當(dāng)小于COLOR_BC_BG 
               
          */  
              
          public static int COLOR_BC_BG = 250;  
                
              
          /********************************************************************** 
               * 驗(yàn)證碼背景干擾線顏色COLOR_FC_LINE 應(yīng)當(dāng)小于COLOR_BC_LINE 
               
          */  
              
          public static int COLOR_FC_LINE = 160;  
              
          /**
               * 驗(yàn)證碼背景干擾線顏色COLOR_FC_LINE 應(yīng)當(dāng)小于COLOR_BC_LINE 
               
          */  
              
          public static int COLOR_BC_LINE = 200;  
                
              
          /*************************************************************************** 
               * 驗(yàn)證碼顏色COLOR_FC_CODE 應(yīng)當(dāng)小于COLOR_BC_CODE 
               
          */  
              
          public static int COLOR_FC_CODE = 20;  
              
          /**
               * 驗(yàn)證碼顏色COLOR_FC_CODE 應(yīng)當(dāng)小于COLOR_BC_CODE 
               
          */  
              
          public static int COLOR_BC_CODE = 170;  
                
              
          /*************************************************************************** 
               * 生成在指定范圍內(nèi)的顏色 
               * 
          @param fc 范圍fc color值 小于255 
               * 
          @param bc 范圍bc color值 小于255 
               * 
          @return Color 
               
          */  
              
          private static Color getRandColor(int fc, int bc) {  
                  Random random 
          = new Random();  
                  
          if (fc < 0)  
                      fc 
          = 0;  
                  
          if (bc < 0)  
                      bc 
          = 1;  
                  
          if (fc > 255)  
                      fc 
          = 255;  
                  
          if (bc > 255)  
                      bc 
          = 255;  
                  
          if (bc == fc)   
                      bc 
          += 10;  
                  
          int temp = 0;  
                  
          if (bc < fc) {  
                      temp 
          = bc;  
                      bc 
          = fc;  
                      fc 
          = temp;  
                  }  
                  
          int r = fc + random.nextInt(bc - fc);  
                  
          int g = fc + random.nextInt(bc - fc);  
                  
          int b = fc + random.nextInt(bc - fc);  
                  
          return new Color(r, g, b);  
              }  
            
              
          /** 
               * <b>function:</b> 生成圖片方法 
               * @createDate 2010-8-3 下午03:06:22 
               * 
          @author hoojo 
               * 
          @param request HttpServletRequest 
               * 
          @param response HttpServletResponse 
               * 
          @return boolean 
               * 
          @throws Exception 
               
          */  
              
          public static boolean getImage(HttpServletRequest request, HttpServletResponse response) throws Exception{  
                  response.reset();  
                  response.setContentType(
          "image/jpeg");  
                  
          // 設(shè)置頁(yè)面不緩存  
                  response.setHeader("Pragma""No-cache");  
                  response.setHeader(
          "Cache-Control""no-cache");  
                  response.setDateHeader(
          "Expires"0);  
                  
          // 在內(nèi)存中創(chuàng)建圖象       
                  BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);  
            
                  
          // 獲取圖形上下文  
                  Graphics img = image.getGraphics();  
                  
          // 生成隨機(jī)類  
                  Random random = new Random();  
            
                  
          // 設(shè)定背景色  
                  img.setColor(getRandColor(COLOR_FC_BG, COLOR_BC_BG));  
                  img.fillRect(
          00, WIDTH, HEIGHT);  
            
                  
          // 設(shè)定字體  
                  img.setFont(new Font("Times New Roman", Font.PLAIN, 18));  
            
                  
          // 畫邊框  
                  
          // g.setColor(new Color());  
                  
          // g.drawRect(0,0,width-1,height-1);  
            
                  
          // 隨機(jī)產(chǎn)生155條干擾線,使圖象中的認(rèn)證碼不易被其它程序探測(cè)到  
                  img.setColor(getRandColor(COLOR_FC_LINE, COLOR_BC_LINE));  
                  
          for (int i = 0; i < 155; i++) {  
                      
          int x = random.nextInt(WIDTH);  
                      
          int y = random.nextInt(HEIGHT);  
                      
          int xl = random.nextInt(12);  
                      
          int yl = random.nextInt(12);  
                      img.drawLine(x, y, x 
          + xl, y + yl);  
                  }  
            
                  
          // 取隨機(jī)產(chǎn)生的認(rèn)證碼(4位數(shù)字)  
                  String codeValue = "";  
                  
          for (int i = 0; i < 4; i++) {  
                      
          //String rand = String.valueOf(random.nextInt(10));  
                      String rand = getRandomChar();  
                      codeValue 
          = codeValue.concat(rand);  
                      img.setFont(getRandomFont());
          //隨機(jī)字體  
                      
          // 將認(rèn)證碼顯示到圖象中  
                      img.setColor(getRandColor(COLOR_FC_CODE, COLOR_BC_CODE));  
                      img.drawString(rand, 
          13 * i + 616);  
                  }  
                  request.getSession().setAttribute(
          "codeValue", codeValue);  
                  
          // 圖象生效  
                  img.dispose();  
                  
          // 輸出圖象到頁(yè)面  
                  return ImageIO.write(image, "JPEG", response.getOutputStream());  
              }  
                
              
          /** 
               * 隨機(jī)生成字符,含大寫、小寫、數(shù)字 
               * <b>function:</b> 功能 
               * @createDate 2010-8-23 上午10:33:55 
               * 
          @author hoojo 
               * 
          @return 
               
          */  
              
          public static String getRandomChar() {  
                  
          int index = (int) Math.round(Math.random() * 2);  
                  String randChar 
          = "";  
                  
          switch (index) {  
                  
          case 0://大寫字符  
                      randChar = String.valueOf((char)Math.round(Math.random() * 25 + 65));  
                      
          break;  
                  
          case 1://小寫字符  
                      randChar = String.valueOf((char)Math.round(Math.random() * 25 + 97));  
                      
          break;  
                  
          default://數(shù)字  
                      randChar = String.valueOf(Math.round(Math.random() * 9));  
                      
          break;  
                  }  
                  
          return randChar;  
              }  
                
              
          /** 
               * <b>function:</b> 隨機(jī)生成字體、文字大小 
               * @createDate 2010-8-23 上午10:44:22 
               * 
          @author hoojo 
               * 
          @return 
               
          */  
              
          public static Font getRandomFont() {  
                  String[] fonts 
          = {"Georgia""Verdana""Arial""Tahoma""Time News Roman""Courier New""Arial Black""Quantzite"};  
                  
          int fontIndex = (int)Math.round(Math.random() * (fonts.length - 1));  
                  
          int fontSize = (int) Math.round(Math.random() * 4 + 16);  
                  
          return new Font(fonts[fontIndex], Font.PLAIN, fontSize);  
              }  

          其中驗(yàn)證碼的值是保存在session中:request.getSession().setAttribute("codeValue", codeValue);
          比較用戶輸入的值和session中的codeValue是否相等即可;

          下面是jsp頁(yè)面調(diào)用servlet:ValidCodeServlet.java

          ValidCodeServlet中調(diào)用了上面的ValidCodeUtils 驗(yàn)證碼生成工具類


          import java.io.IOException;  
          import javax.servlet.ServletException;  
          import javax.servlet.http.HttpServlet;  
          import javax.servlet.http.HttpServletRequest;  
          import javax.servlet.http.HttpServletResponse;  
            
          import com.hoo.util.ValidCodeUtils;  
            
          @SuppressWarnings(
          "serial")  
          public class ValidCodeServlet extends HttpServlet {  
                
              
          public void doGet(HttpServletRequest request, HttpServletResponse response)  
                      
          throws ServletException, IOException {  
                  
          try {  
                      ValidCodeUtils.getImage(request, response);  
                  } 
          catch (Exception e) {  
                      e.printStackTrace();  
                  }  
              }  
            
              
          public void doPost(HttpServletRequest request, HttpServletResponse response)  
                      
          throws ServletException, IOException {  
                  doGet(request, response);  
              }  


          jsp頁(yè)面調(diào)用servlet方法即可
              js:reloadValidCode方法  
                

          function reloadValidCode(o) {

              o.src = "${pageContext.request.contextPath }/validCodeServlet?timed=" + new Date().getMilliseconds(); 

          }

           

          function refresh() {

             document.getElementById("imageYZ").src = "${pageContext.request.contextPath }/validCodeServlet?timed=" + new Date().getMilliseconds(); 

          }

              這里的"timed=" + new Date().getMilliseconds();是需要防止IE緩存用的  
                
              html標(biāo)簽:  
             

          <img src="${pageContext.request.contextPath }/validCodeServlet" id="imageYZ" alt="換一張" onclick="reloadValidCode(this)"/>

          看不清?<a href="#this" onclick="refresh();"> 換一張</a>

           
              直接跟Servlet名稱配置的url即可,和web.xml配置對(duì)應(yīng)。主要調(diào)用路徑${pageContext.request.contextPath }
          /validCodeServlet這樣會(huì)帶上根目錄,比較保險(xiǎn)。  
                
              web.xml中validCodeServlet配置  
              
          <servlet>  
                  
          <servlet-name>validCodeServlet</servlet-name>  
                  
          <servlet-class>com.hoo.servlet.ValidCodeServlet</servlet-class>  
              
          </servlet>  
                
              
          <servlet-mapping>  
                  
          <servlet-name>validCodeServlet</servlet-name>  
                  
          <url-pattern>/validCodeServlet</url-pattern>  
              
          </servlet-mapping>

          至此,整個(gè)圖片驗(yàn)證碼就配置完畢。在瀏覽器中輸入你請(qǐng)求的url,在jsp頁(yè)面中就可以看到效果

           


          posted on 2012-03-16 09:32 canry Tong 閱讀(1386) 評(píng)論(0)  編輯  收藏 所屬分類: jsp
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          留言簿

          文章分類

          文章檔案

          搜索

          •  

          最新評(píng)論

          主站蜘蛛池模板: 临安市| 荔浦县| 满洲里市| 梁平县| 玉林市| 虹口区| 平安县| 清流县| 弥渡县| 酒泉市| 鸡东县| 富阳市| 岢岚县| 饶阳县| 常熟市| 张家口市| 武穴市| 抚顺市| 霸州市| 丰都县| 平度市| 张家口市| 岑巩县| 德保县| 阿拉善右旗| 伊金霍洛旗| 乌鲁木齐市| 合江县| 辉南县| 凤山县| 五常市| 新郑市| 山阴县| 德化县| 天全县| 甘德县| 多伦县| 承德县| 娄烦县| 鄄城县| 无棣县|