<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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è)置頁面不緩存  
            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();  
            
    // 輸出圖象到頁面  
            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頁面調(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頁面調(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頁面中就可以看到效果

     


    posted on 2012-03-16 09:32 canry Tong 閱讀(1386) 評(píng)論(0)  編輯  收藏 所屬分類: jsp
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    留言簿

    文章分類

    文章檔案

    搜索

    •  

    最新評(píng)論

    主站蜘蛛池模板: 四虎影视久久久免费| 野花高清在线电影观看免费视频 | 亚洲熟女www一区二区三区| 免费无码又爽又刺激高潮视频| 久久精品国产亚洲精品| 一区二区视频在线免费观看| 免费中文字幕在线| 羞羞视频免费网站日本| 久久久久亚洲精品无码网址| 伊人久久大香线蕉免费视频| 国产成人亚洲精品青草天美| 毛片免费在线观看| 亚洲精品视频在线观看视频| 成人免费视频77777| 亚洲精品美女久久7777777| 日本特黄特黄刺激大片免费| 黄a大片av永久免费| 亚洲av色香蕉一区二区三区蜜桃| 成人免费一区二区三区在线观看| 亚洲人成电影网站色www| 国产人成免费视频| 香蕉免费一级视频在线观看| 国产亚洲美女精品久久久久狼| 午夜不卡久久精品无码免费| 91亚洲精品麻豆| 免费大黄网站在线看| 99在线免费观看| 亚洲人成77777在线播放网站不卡| 成年轻人网站色免费看| 免费夜色污私人影院网站电影| 亚洲毛片αv无线播放一区| 免费A级毛片无码专区| 亚洲中文无码亚洲人成影院| 免费人成年激情视频在线观看| 中文字幕在线视频免费| 亚洲国产精品综合久久2007| 国产成人免费a在线视频色戒| 国产真人无码作爱免费视频| 亚洲一欧洲中文字幕在线| 亚洲中文字幕无码一久久区| 毛片免费全部免费观看|