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

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

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

    純JAVA技術(shù)驗(yàn)證碼生成器(服務(wù)器端servlet實(shí)現(xiàn))(不是javascript哦~)

    java驗(yàn)證碼生成器,自認(rèn)為還算經(jīng)典import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.util.Random;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import com.sun.image.codec.jpeg.JPEGCodec;
    import com.sun.image.codec.jpeg.JPEGImageEncoder;
    /**
    * @(#)VerifyCodeServlet.java Dec 9, 2007 8:14:14 PM
    *
    * @author Yuan
    * 驗(yàn)證碼生成器,使用此類(lèi)需要將表單里的驗(yàn)證碼輸入框的name屬性設(shè)為"verifycode"
    */
    public class VerifyCodeGenerator {
        
        private static final VerifyCodeGenerator generator = new VerifyCodeGenerator();
        
        private final String ATTRIBUTE_NAME = "verifycode";
        //圖片的寬度
        private final int WIDTH = 15;
        //圖片的高度
        private final int HEIGHT = 22;
        //字符串長(zhǎng)度
        private final int CODE_LENGTH = 4;
        //隨機(jī)字符串范圍
        private final String RAND_RANGE = "abcdefghijklmnopqrstuvwxyz"
            + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            + "1234567890"
            + "@#quot;;
        
        private final char[] CHARS = RAND_RANGE.toCharArray();
        
        private Random random = new Random();
        
        private VerifyCodeGenerator(){
            //
        }
        
        public static VerifyCodeGenerator getInstance(){
            return generator;
        } 
         

        /**
         * 生成隨機(jī)字符串
         * @return 隨機(jī)字符串
         */
        private String getRandString(){
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < CODE_LENGTH; i++)
                sb.append(CHARS[random.nextInt(CHARS.length)]);
            return sb.toString();
        }
        
        /**
         * 生成隨機(jī)顏色
         * @param ll 產(chǎn)生顏色值下限(lower limit)
         * @param ul 產(chǎn)生顏色值上限(upper limit)
         * @return 生成的隨機(jī)顏色對(duì)象
         */
        private Color getRandColor(int ll, int ul){
            if (ll > 255) ll = 255;
            if (ll < 1) ll = 1;
            if (ul > 255) ul = 255;
            if (ul < 1) ul = 1;
            if (ul == ll) ul = ll + 1;
            int r = random.nextInt(ul - ll) + ll;
            int g = random.nextInt(ul - ll) + ll;
            int b = random.nextInt(ul - ll) + ll;
            Color color = new Color(r,g,b);
            return color;
        }
        
        /**
         * 生成指定字符串的圖像數(shù)據(jù)
         * @param verifyCode 即將被打印的隨機(jī)字符串
         * @return 生成的圖像數(shù)據(jù)
         * */
        private BufferedImage getImage(String verifyCode){
            
            BufferedImage image = new BufferedImage(WIDTH * CODE_LENGTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
            
            //獲取圖形上下文
            Graphics graphics = image.getGraphics();
            
            //設(shè)置背景色
            graphics.setColor(getRandColor(1,50));
            //填充背景色
            graphics.fillRect(0, 0, WIDTH * 4, HEIGHT);
            
            //設(shè)置邊框顏色
            graphics.setColor(new Color(0,255,0));
            //畫(huà)邊框
            for (int i=0; i<2; i++)
                graphics.drawRect(i, i, WIDTH * CODE_LENGTH - i * 2 - 1, HEIGHT - i * 2 - 1);
            
            //設(shè)置隨機(jī)干擾線條顏色
            graphics.setColor(getRandColor(50,100));
            //產(chǎn)生50條干擾線條
            for (int i=0; i<50; i++){
                int x1 = random.nextInt(WIDTH * CODE_LENGTH - 4) + 2;
                int y1 = random.nextInt(HEIGHT - 4) + 2;
                int x2 = random.nextInt(WIDTH * CODE_LENGTH - 2 - x1) + x1;
                int y2 = y1;
                graphics.drawLine(x1, y1, x2, y2);
            }
            
            //設(shè)置字體
            graphics.setFont(new Font("Times New Roman", Font.PLAIN, 18));
            //畫(huà)字符串
            for (int i=0; i<this.CODE_LENGTH; i++){
                String temp = verifyCode.substring(i, i+1);
                graphics.setColor(getRandColor(100,255));
                graphics.drawString(temp, 13 * i + 6, 16);
            } 
             
            //圖像生效
            graphics.dispose();
            
            return image;
        }
        
        /**
         * 將驗(yàn)證碼的圖像輸出
         * @param request 用戶的請(qǐng)求對(duì)象
         * @param response 用戶的響應(yīng)對(duì)象
         * */
        public void printImage(HttpServletRequest request,
                HttpServletResponse response){
            //將ContentType設(shè)為"image/jpeg",讓瀏覽器識(shí)別圖像格式。
            response.setContentType("image/jpeg");
            //設(shè)置頁(yè)面不緩存
            response.setHeader("Pragma", "No-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expires", 2000);
            
            //獲得隨機(jī)驗(yàn)證碼
            String verifyCode = this.getRandString();
            String str = "ssss";
            for(int i=0; i<10; i++)
                str = str + str;
            //獲得驗(yàn)證碼的圖像數(shù)據(jù)
            BufferedImage bi = this.getImage(verifyCode);
            //把驗(yàn)證碼存入session
            request.getSession().setAttribute(ATTRIBUTE_NAME, verifyCode);
            try{
                //獲得Servlet輸出流
                ServletOutputStream outStream = response.getOutputStream();
                //創(chuàng)建可用來(lái)將圖像數(shù)據(jù)編碼為JPEG數(shù)據(jù)流的編碼器
                JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outStream);
                //將圖像數(shù)據(jù)進(jìn)行編碼
                encoder.encode(bi);
                //強(qiáng)行將緩沖區(qū)的內(nèi)容輸入到頁(yè)面
                outStream.flush();
                //關(guān)閉輸出流
                outStream.close();
            }catch(IOException ex){
                ex.printStackTrace();
            }
        }
        
        /**
         * 檢查輸入的驗(yàn)證碼是否正確,若用戶輸入的驗(yàn)證碼與生成的驗(yàn)證碼相符則返回true,否則返回false。
         * @param request 用戶的請(qǐng)求對(duì)象
         * @return 驗(yàn)證結(jié)果
         * */
        public boolean check(HttpServletRequest request){
            if (((String)request.getParameter(ATTRIBUTE_NAME))
                    .equalsIgnoreCase((String)request.getSession().getAttribute(ATTRIBUTE_NAME))){
                request.getSession().removeAttribute(ATTRIBUTE_NAME);
                return true;
            }
            return false;
        }
    }
    /**此代碼為我們?nèi)豪洗笊钋镄∮?br /> 所編寫(xiě),真的比較實(shí)用,來(lái)自qq群J道
    **/

    posted on 2008-04-05 12:40 伍興佳 閱讀(5457) 評(píng)論(10)  編輯  收藏

    評(píng)論

    # re: 純JAVA技術(shù)驗(yàn)證碼生成器(服務(wù)器端servlet實(shí)現(xiàn))(不是javascript哦~)[未登錄](méi) 2008-04-05 21:21 子玉

    請(qǐng)問(wèn)這個(gè)類(lèi)該如何調(diào)用呢?能不能給個(gè)調(diào)用的例子?謝謝  回復(fù)  更多評(píng)論   

    # re: 純JAVA技術(shù)驗(yàn)證碼生成器(服務(wù)器端servlet實(shí)現(xiàn))(不是javascript哦~) 2008-04-05 22:00 伍興佳

    已經(jīng)很清楚了啊,表單調(diào)用,服務(wù)端程序都是通過(guò)表單調(diào)用,驗(yàn)證碼生成器,使用此類(lèi)需要將表單里的驗(yàn)證碼輸入框的name屬性設(shè)為"verifycode" ,不知道你是什么意思。@子玉
      回復(fù)  更多評(píng)論   

    # re: 純JAVA技術(shù)驗(yàn)證碼生成器(服務(wù)器端servlet實(shí)現(xiàn))(不是javascript哦~)[未登錄](méi) 2008-04-06 12:27 子玉

    servlet如何調(diào)用這個(gè)類(lèi),還是直接寫(xiě)到servlet里?
    前臺(tái)的request如何傳給VerifyCodeGenerator?對(duì)不起,我是新手上路  回復(fù)  更多評(píng)論   

    # re: 純JAVA技術(shù)驗(yàn)證碼生成器(服務(wù)器端servlet實(shí)現(xiàn))(不是javascript哦~) 2008-04-07 08:45 Jarod

    java生成驗(yàn)證碼見(jiàn)的多,看標(biāo)題博主好像會(huì)用JS生成,期望能在下篇文章中分享一下  回復(fù)  更多評(píng)論   

    # re: 純JAVA技術(shù)驗(yàn)證碼生成器(服務(wù)器端servlet實(shí)現(xiàn))(不是javascript哦~) 2008-04-07 12:30 伍興佳

    JS中我只會(huì)生成純數(shù)字和字符驗(yàn)證碼,生成圖像的我不會(huì)。  回復(fù)  更多評(píng)論   

    # re: 純JAVA技術(shù)驗(yàn)證碼生成器(服務(wù)器端servlet實(shí)現(xiàn))(不是javascript哦~) 2008-04-08 13:55 lmjq

    謝謝分享,我用這個(gè)做了個(gè)例子,http://blog.csdn.net/lmjq/archive/2008/04/08/2259670.aspx
      回復(fù)  更多評(píng)論   

    # re: 純JAVA技術(shù)驗(yàn)證碼生成器(服務(wù)器端servlet實(shí)現(xiàn))(不是javascript哦~) 2008-12-05 11:51 jixinzheng@hotmail.com

    部署這個(gè)servlet以后在瀏覽器中只看到一個(gè)圖片的占位符,作者測(cè)過(guò)沒(méi)有?  回復(fù)  更多評(píng)論   

    # re: 純JAVA技術(shù)驗(yàn)證碼生成器(服務(wù)器端servlet實(shí)現(xiàn))(不是javascript哦~)[未登錄](méi) 2009-10-05 13:52 呆呆

    這個(gè)驗(yàn)證碼太不安全了。客戶端可以先獲得session 然后將這個(gè)值寫(xiě)到你哪個(gè)文本框里。驗(yàn)證碼就沒(méi)多太的意思了。  回復(fù)  更多評(píng)論   

    # re: 純JAVA技術(shù)驗(yàn)證碼生成器(服務(wù)器端servlet實(shí)現(xiàn))(不是javascript哦~) 2012-12-18 14:56 eee

    eeee  回復(fù)  更多評(píng)論   

    # re: 純JAVA技術(shù)驗(yàn)證碼生成器(服務(wù)器端servlet實(shí)現(xiàn))(不是javascript哦~) 2014-06-25 20:42 dsadas

    dasdasdad  回復(fù)  更多評(píng)論   


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    <2009年10月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導(dǎo)航

    統(tǒng)計(jì)

    公告

    這是伍嗲的純JAVA技術(shù)博客

    常用鏈接

    留言簿(1)

    隨筆檔案

    文章分類(lèi)

    相冊(cè)

    技術(shù)鏈接

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲精品视频观看| 曰批全过程免费视频观看免费软件| 国产成人yy免费视频| 亚洲精品天堂成人片AV在线播放| 国产精品亚洲玖玖玖在线观看| 久久午夜无码免费| 亚洲国产成人无码AV在线| 伊人久久亚洲综合| 黄页网站在线看免费| 一区二区在线视频免费观看| 亚洲国产精品久久久久| 国产乱人免费视频| 日韩人妻一区二区三区免费| 亚洲中文字幕日本无线码| 亚洲一区二区三区无码影院| 免费专区丝袜脚调教视频| 黄色一级视频免费| 亚洲免费黄色网址| 中文字幕一精品亚洲无线一区| 久久久久久国产a免费观看黄色大片 | 五月亭亭免费高清在线| 污网站在线观看免费| 亚洲另类精品xxxx人妖| 国产偷国产偷亚洲清高动态图 | 成人无码区免费A∨直播| 国产精品久久亚洲不卡动漫| 亚洲色偷偷综合亚洲AVYP| 四虎影视www四虎免费| 小日子的在线观看免费| 一区二区免费国产在线观看| 免费无码一区二区三区蜜桃大 | 97无码免费人妻超级碰碰夜夜| a毛片免费观看完整| 亚洲精华国产精华精华液网站| 亚洲国产成人久久精品影视| 亚洲黄黄黄网站在线观看| 久久精品网站免费观看| 182tv免费观看在线视频| 三年片免费高清版 | 中国精品一级毛片免费播放| 成人婷婷网色偷偷亚洲男人的天堂|