JAVA随机生成验证码(一)

<b style=“font-color:red;”>图片验证码原理:</b>服务器生成包含随机字符的字符串图片发给客户端,客户端提交数据需要填写字符串作为验证。而字符串保存在图片中,机器难以识别,达到防止有人利用程序恶意发送信息的目的。

JAVA随机生成图片

JAVA随机生成图片步骤如下:

  1. 创建图片缓存区 传参为宽高和图片类型
BufferedImage bi = new 
BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
  1. 获取画笔并绘画
Graphics g = bi.getGraphics();  //获取画笔
g.setFont(new Font(Font.SANS_SERIF,Font.BOLD,16));//设置字体
g.setColor(color);//设置画笔颜色
g.fillRect(0, 0, width, height);   //绘制背景
  1. 输出图片
    ImageIO.write(bi, "JPG", resp.getOutputStream());
JAVA实现验证码实例
servlet生成验证码图片源码
package com.javaweb.respones;

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.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class IdentityServlet extends HttpServlet{
    
//  设置字符
    public static final char[] chars="1234567890QWERTYUIOPASDFGHJKLZXCVBNM".toCharArray();
    
//  设置随机数
    public static Random random = new Random();
    
//  获取4位随机数
    public static String getRandomString(){
        StringBuffer buffer = new StringBuffer();
        int index;   //获取随机chars下标
        for(int i=0;i<4;i++){
            index = random.nextInt(chars.length);  //获取随机chars下标
            buffer.append(chars[index]);
        }
        return buffer.toString();
    }
    
//  获取随机颜色
    public static Color getRandomColor(){
        return new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255));
    }
    
//  返回某颜色的反色
    public static Color getReverseColor(Color c){
//      防止反色和原色相近
        if(c.getRed()<130&&c.getRed()>125 && c.getBlue()<130&& c.getBlue()>125 &&
                c.getGreen()<130&&c.getGreen()>125){
            return new Color(255,255,255);
        }else{
            return new Color(255-c.getRed(),255-c.getGreen(),255-c.getBlue());
        }
    }
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        
        String code = getRandomString();  //获取随机验证码
        req.getSession().setAttribute("code", code); //放入Session
        
        int width = 100;    //图片宽度
        int height = 30;    //图片高度
        
        Color color =   getRandomColor();  //随机色,用于背景色
        Color reverse = getReverseColor(color);  //反色,用于前景色
        
        
        /**
         * 生成带字符串的文本图片
         */
//      1.创建图片缓存区     传参为宽高和图片类型
        BufferedImage bi = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//      2.获取画笔并绘画
        Graphics g = bi.getGraphics();
        g.setFont(new Font(Font.SANS_SERIF,Font.BOLD,16));//设置字体
        g.setColor(color);//设置画笔颜色
        g.fillRect(0, 0, width, height);   //绘制背景
        g.setColor(reverse);   //设置画笔颜色
        g.drawString(code, 18, 20); //绘制字符
//      设置最多100个噪音点
        for(int i=0,n = random.nextInt(100);i<n;i++){
            g.drawRect(random.nextInt(width), random.nextInt(height), 1, 1);
        }
        
//      3.输出图片
        ImageIO.write(bi, "JPG", resp.getOutputStream());
    }
    
}

生成图片验证码主要应用随机数生成器Random生成随机颜色绘制背景,取反色*绘制字符,并绘制最多100随机位置的噪音点,增加识别难度。

配置XML
  <servlet>
    <servlet-name>IdentityServlet</servlet-name>
    <servlet-class>com.javaweb.respones.IdentityServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>IdentityServlet</servlet-name>
    <url-pattern>/servlet/IdentityServlet</url-pattern>
  </servlet-mapping>
html展示页面
<head>
    <script type="text/javascript">
    function reloadImage(){
        document.getElementById('btn').disable=true;
        document.getElementById('identity').src='servlet/IdentityServlet?time='
            +new Date().getTime();      
    }
    </script>
  </head>
  
  <body>
    <img src = "servlet/IdentityServlet" id="identity" onload="btn.disabled= false;">
    <input type="button" value="换个图片" onclick="reloadImage()" id="btn">
  </body>
截图展示


下篇介绍利用组件Jcaptcha和Kaptcha生成验证码。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,639评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,277评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,221评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,474评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,570评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,816评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,957评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,718评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,176评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,511评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,646评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,322评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,934评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,755评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,987评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,358评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,514评论 2 348

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,773评论 25 707
  • http://blog.csdn.net/ayhlay/article/details/13625275 1.验证...
    蘋果_283e阅读 443评论 0 0
  • 昨天妈妈打电话说,姑爷病了,也没人照顾,现在一个人在家也挺孤单的。我心里瞬间酸酸的。 姑爷之于我就像《天堂电影院》...
    淘汽十一郎阅读 897评论 0 0
  • (一)摇篮计划 “杀戮和死亡从来都不是原罪,出生才是。”——蓝星旧约 蓝星出事了。 这些天来,不详的预感越来越强烈...
    诸葛妖道阅读 1,153评论 0 4
  • 基督能量的出发点是人与人之间的平等与手足之情,一旦这一能量在你心中觉醒,你会将他人看作某一整体的一部分,...
    静心521阅读 2,344评论 0 0