java原生一次性验证码


前言

java 一次性验证码


环境依赖

1.tomcat 10.0.23版本下的servlet-api.jar

提示:以下是本篇文章正文内容,注释数字顺序,代表思考顺序和阅读理解顺序。

生成验证码代码

代码如下(示例):

import jakarta.servlet.ServletException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;



public class CheckServlet extends HttpServlet {
    private static  int WIDTH = 60; //验证码宽度
    private static  int HEIGHT = 20; //验证码高度
    public void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        resp.setContentType("image/jpeg");
        ServletOutputStream sos =resp.getOutputStream(); //(1.开启响应输出的管道)
        //设置浏览器不要缓存此图片
        resp.setHeader("Pragma","No-cache");
        resp.setHeader("Cache-Control","no-cache");
        resp.setDateHeader("Expires",0);
        //创建内存图像并获得其图形上下文
        BufferedImage image = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_BGR); //用代码生成的图像,画出具有宽高和带颜色像素属性的图像(此时没有内容和背景都为空)(3.空壳容器)
        //将内存图像挂载到g上,即用g获取图形上下文的操作权限
        Graphics g =image.getGraphics();//获取了操作权限 才能用g这个画笔画出内容(4.)
        //产生随机的认证码
        char [] rands = generateCheckCode();//(5.内容的样子)
        //产生图像
        drawBackground(g);//(6.画背景)
        drawRands(g,rands); //(7.画内容)
        //结束图像的绘制过程,完成图像
        g.dispose();//(8.抽出画笔,封图)
        //将图像输出到客户端
        ByteArrayOutputStream bos = new ByteArrayOutputStream();//开启一个管道,用来转化数据流 (9.转化图像(连通一个平级对象)
        ImageIO.write(image,"JPEG",bos);//将画好的image图像,转化可传输数据流到bos上
        byte [] buf = bos.toByteArray();//(10.,转为可直接传输的字节数组后,放入通往客户端的管道中,完成传输))
        resp.setContentLength(buf.length);
        //下面的语句也可写成:bos.writeTo(sos);
        sos.write(buf);//将图像加工后的可以让浏览器识别展示的 图像放入管道中,(2.回溯加工的图像)
        bos.close();//(11.)关闭管道
        sos.close();//(12.)关闭管道
        //将当前验证码存入Session中
        session.setAttribute("check_code",new String(rands));
        //直接使用下面的代码将有问题,Session对象必须在提交响应前获得
        //req.getSession().setAttribute("check_code",new String(rands));

    }

    //生成一个4字符的验证码
    private char[] generateCheckCode ()
    {
        //定义验证码的字符表
        String chars = "0123456789abcdefghijklmnopqrstuvwxyz";
        char[] rands = new char[4];
        for (int i =0;i<4;i++){
            int rand =(int) (Math.random()*36);
            rands[i] = chars.charAt(rand);  //charAt() 字符串方法 返回指定位置的单个字符
        }
        return rands;
    }

    private  void drawRands (Graphics g, char[] rands){
        g.setColor(Color.BLACK);
        g.setFont(new Font(null,Font.ITALIC|Font.BOLD,18));
        //在不同的高度上输出验证码的每个字符
        g.drawString("" + rands[0],1,17);
        g.drawString("" + rands[1],16,17);
        g.drawString("" + rands[2],31,17);
        g.drawString("" + rands[3],46,17);
        System.out.println(rands);
    }

    private void drawBackground(Graphics g){
        //画背景
        g.setColor(new Color(0xDCDCDC));
        g.fillRect(0,0,WIDTH,HEIGHT);
        //随机产生120个干扰点
        for (int i =0;i<120;i++){
            int x =(int)(Math.random()*WIDTH);
            int y =(int)(Math.random()*HEIGHT);
            int red =(int)(Math.random()*255);
            int green =(int)(Math.random()*255);
            int blue =(int)(Math.random()*255);
            g.setColor(new Color(red,green,blue));
            g.drawOval(x,y,1,0);

        }
    }
}

引用示例

   <img src="/lianxi01/CheckServlet" alt="">

成果

在这里插入图片描述

个人博客: dulred.cn(正在搭建中)
github: https://github.com/Dulred


总结

以上就是今天要讲的内容。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值