手动绘画一个验证码

190 阅读2分钟

用久了模板和工具,使用最普通的servlet和jsp,手动画一个验证码,随心搭配。

知识点梳理及部分源码解析:

想要绘画一个图案,首先需要获得画板和画笔!

  • 通过BufferedImage类下面的构造方法,源码看下图,可以自定义设置一个width,height,imageType属性的画板,imageType种类丰富。

huaban.png

  • 通过BufferedImage类下面的成员方法,有两种画笔源码看下图,本文选择第一种来绘画,java.awt.Graphics是一个用来绘制2D图像必须导入的java包,提供对图形图像的像素,颜色的绘制等。以此可以设置验证码颜色,大小,字体等等。

bi.png

页面绘画完毕后,接下来,写一下业务逻辑,添加验证码内容以及获取方式!

  • 自定义一个验证码输出内容字符串,可使用StringBuffer,来自定义随机获取内容数量,(对,手画的好处就是这么随意),用到一个方法:document.getElementById('id值').src="路径",此方法写在jsp中,用于验证码随机生成替换。

话不多说,附上源码!

servlet代码

import java.util.Random;
import java.util.stream.IntStream;

@WebServlet("/checkCode")
public class CheckCodeServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("image/jpeg");
        OutputStream os = resp.getOutputStream();
        //画板
        BufferedImage image = new BufferedImage(60, 20, BufferedImage.TYPE_INT_RGB);
        //画笔
        Graphics g = image.getGraphics();
       //给验证码设置颜色,大小,位置等
        Random r = new Random();
        g.setColor(new Color(r.nextInt(256),r.nextInt(256),r.nextInt(256)));
        g.fillRect(0,0,60,20);
        g.setColor(Color.black);
        g.setFont(new Font(null,Font.BOLD,15));
        g.drawString(getNum(5),5,15);
        //添加线条,增加验证码辨认难度
        IntStream.range(0,5).forEach(key->{
            g.setColor(new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256)));
            g.drawLine(r.nextInt(30),r.nextInt(10),r.nextInt(30),r.nextInt(10));
        });

        //输出
        ImageIO.write(image,"jpeg",os);
    }
    private String getNum(int length){
        String str = "ABCDEFGHIGKLMNOPQRSTUVWXYZ23456789";
        Random random = new Random();
        StringBuffer sbf = new StringBuffer();
        for (int i = 0; i < length; i++) {
            int index = random.nextInt(str.length());
            char c = str.charAt(index);
            sbf.append(c);

        }
        return sbf.toString();
    }

}

页面部分

页面.png

效果图

check.png