jsp+servlet生成動態(tài)驗證碼及驗證

之前一直覺得會生成驗證碼的人都是元老級人物,直到今天我很幸學(xué)到了生成動態(tài)驗證碼的方法边篮,其實并沒有想象中的那么難嘛鸽凶,所以篮赢,我將所學(xué)的分享給廣大的即將要從成為程序猿的們齿椅,希望大家多提點意見。
前端展示頁面

<script type="text/javascript">
    function changeCode(){
        var imgObj = document.getElementById("img");
        imgObj.src = "CheckCodeServlet?id="+new Date();
    }
</script>
<body>
<span style="color:red;">${errorMsg}</span>
<form action="DealCheckcodeServlet" method="post">
<input type="text" name="code"/>
<i.m.g  src="CheckCodeServlet" id="img" onclick="changeCode()"><!--由于markdown格式會將img自動轉(zhuǎn)化成圖片格式启泣,所以我用的是i.m.g--!>
<input type="submit"/>
</form>
</body>

servlet頁面一:CheckCodeServlet
主要完成驗證碼的生成

protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
Random r = new Random();
        // 1.確定圖片的大小
        int w = 100;
        int h = 30;
        // 2.創(chuàng)建畫板
        BufferedImage board = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        // 3.創(chuàng)建畫筆
        Graphics pen = board.getGraphics();
        // 4.調(diào)制顏色
        Color c_bg = new Color(200 + r.nextInt(40), 200 + r.nextInt(40), 200 + r.nextInt(40));
        // 5.給畫筆注入當(dāng)前的背景要繪制的顏色
        pen.setColor(c_bg);
        // 6.畫背景
        pen.fillRect(0, 0, w, h);

        String judgeCode = "";
        for (int i = 1; i < 5; i++) {
            // 生成一位隨機驗證碼
            // 7.生成驗證碼
            // 改變畫筆的顏色媒咳,防止與背景顏色相同
            Color c_code = new Color(100 + r.nextInt(40), 100 + r.nextInt(40), 100 + r.nextInt(40));
            // 給畫筆注入驗證碼的顏色
            pen.setColor(c_code);
            // 設(shè)置畫筆所畫出的字體風(fēng)格
            Font f_code = new Font("斜體", Font.ITALIC, 18);
            // 將字體風(fēng)格注入筆中
            pen.setFont(f_code);
            // 隨機生成一個大寫字母Unicode(ASCII碼)
            int upcaseCode = 65 + r.nextInt(26);
            // 隨機生成一個小寫字母的Unicode
            int lowcaseCode = 97 + r.nextInt(26);
            // 隨機生成數(shù)字
            int numCode = r.nextInt(10);

            // 轉(zhuǎn)化成具體的字符串,字符串可以追加起來
            // 將字母所對應(yīng)的碼轉(zhuǎn)化成相應(yīng)的字母
            String upcaseStr = String.valueOf((char) upcaseCode);
            String lowcaseStr = String.valueOf((char) lowcaseCode);
            String numStr = String.valueOf(numCode);
            // n1與n2的值是0或者1
            int n1 = r.nextInt(2);
            int n2 = r.nextInt(2);
            String code = "";
            if (n1 > 0.5) {
                // 生成的是字母
                // 生成大寫字母
                if (n2 > 0.5) {
                    code = upcaseStr;
                    judgeCode = judgeCode + upcaseStr;
                } else {
                    // 生成小寫字母
                    code = lowcaseStr;
                    judgeCode = judgeCode + lowcaseStr;
                }
            } else {
                // 生成數(shù)字
                code = numStr;
                judgeCode = judgeCode + numStr;
            }

            request.getSession().setAttribute("judgeCode",judgeCode);
            System.out.println(judgeCode);
            
            // 畫驗證碼(20*i, 20是驗證碼的位置)
            pen.drawString(code, 20*i, 20);
        }
        
//      壓縮成圖片种远,做成響應(yīng)輸出
        ImageIO.write(board, "jpg", response.getOutputStream());
}

servlet頁面二:DealCheckcodeServlet

主要完成驗證碼的刷新以及正確判斷

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        String code = request.getParameter("code");
        String jugdeCode = (String)request.getSession().getAttribute("judgeCode");
        System.out.println(jugdeCode);
        if(code.equalsIgnoreCase(jugdeCode)){
            request.getRequestDispatcher("welcome.jsp").forward(request, response);
        }else{
            String errorMsg = "驗證碼有錯誤";
            request.setAttribute("errorMsg", errorMsg);
            request.getRequestDispatcher("judgeCode.jsp").forward(request, response);
        }
    }

部分運行效果展示

1.jpg
2.jpg
3.jpg

完整的項目,github,大家自行下載顽耳。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末坠敷,一起剝皮案震驚了整個濱河市妙同,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌膝迎,老刑警劉巖粥帚,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異限次,居然都是意外死亡芒涡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門卖漫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來费尽,“玉大人,你說我怎么就攤上這事羊始『涤祝” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵突委,是天一觀的道長柏卤。 經(jīng)常有香客問我,道長匀油,這世上最難降的妖魔是什么缘缚? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮敌蚜,結(jié)果婚禮上桥滨,老公的妹妹穿的比我還像新娘。我一直安慰自己钝侠,他們只是感情好该园,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著帅韧,像睡著了一般里初。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上忽舟,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天双妨,我揣著相機與錄音,去河邊找鬼叮阅。 笑死刁品,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的浩姥。 我是一名探鬼主播挑随,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼勒叠!你這毒婦竟也來了兜挨?” 一聲冷哼從身側(cè)響起膏孟,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拌汇,沒想到半個月后柒桑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡噪舀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年魁淳,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片与倡。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡界逛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蒸走,到底是詐尸還是另有隱情仇奶,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布比驻,位于F島的核電站该溯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏别惦。R本人自食惡果不足惜狈茉,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望掸掸。 院中可真熱鬧氯庆,春花似錦、人聲如沸扰付。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽羽莺。三九已至实昨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盐固,已是汗流浹背荒给。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留刁卜,地道東北人志电。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像蛔趴,于是被迫代替她去往敵國和親挑辆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容