Servlet自制验证码图片,并输出到web页面(附源代码)(小白入门,大佬莫嘲)

话不多说,直接上代码,内附详细注释。
用到的类对象以及方法如下:

  1. BufferedImage类对象,构造方法传参图片宽度,高度,图片类型(可以直接使用BufferedImage的常量,eg:BufferedImage.TYPE_INT_RGB);
  2. Graphic类对象,通过BufferedImage对象的getGraphic()方法获取;
    1. fillRect():填充背景色
    2. setColor():设置画笔颜色
    3. drawRect():画方框
    4. drawString():写字符串
    5. drawLine():画直线
  3. Random对象
    1. nextInt():获取一个新的随机数
    参数:随机数上限
  4. ImageIO对象
    1. write():写图片到流的目的地。
    参数: 图片对象、图片类型、流对象
@WebServlet("/checkCodeServlet")
public class CheckCodeServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.创建一个对象,就是在内存中的一个图片(验证码图片对象):
        //BufferedImage对象:传参图片的宽、高、类型(宽和高一般提前设置为一个变量)
        int width = 200;
        int height = 80;
        BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
        //2.美化图片
        //2.1 填充背景色
        // 获取画笔对象,getGraphics()方法;
        Graphics g = image.getGraphics();
        // 设置画笔颜色setColor(),传参颜色对象的变量(Color.颜色)
        g.setColor(Color.pink);
        g.fillRect(0,0,width,height);
        //2.2 画边框
        // 设置画笔颜色;
        g.setColor(Color.BLUE);
        g.drawRect(0,0,width-1,height-1);// 画线方法drawRect(),传参边框的起点坐标x和y,以及边框的宽度width高度height
        //2.3 生成验证码字符串
        // 定义一个源字符串String对象
        String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        Random ran = new Random();//生成随机角标(Random对象的nextInt()方法 传参随机数的最大值为字符串的长度
        for (int i = 1;i <= 4;i++){
            int index = ran.nextInt(str.length());//循环生成随机角标对应的字符
            char ch = str.charAt(index);
            g.drawString(ch+"",width/5*i,height/2);//把生成的字符画到图片上:drawString()方法,传参字符对象和字符在图片中的位置坐标
        }
        //2.4画干扰线:drawLine()方法,传参干扰线的起始坐标和结束坐标
        g.setColor(Color.green);//设置画笔颜色
        for (int j = 0; j < 8; j++) {//循环生成随机坐标点,并画线到图片
            int x1 = ran.nextInt(width);
            int x2 = ran.nextInt(width);
            int y1 = ran.nextInt(height);
            int y2 = ran.nextInt(height);
            g.drawLine(x1,y1,x2,y2);
        }
        //3.把图片输出到页面显示:ImageIO对象的write()方法,传参图片对象,图片类型,输出流对象
        ImageIO.write(image,"jpg",response.getOutputStream());
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

效果如图所示,这里使用IE浏览器查看,谷歌火狐会将背景解析为黑色,不好看出来效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值