java实现随机字母验证码

今天给大家带来随机字母验证码的思路以及代码分享

在这之前我们首先要思考这个功能的代码思路

        先从前台开始

        前台需要生成验证码时,向后台请求数据,然后后台收到请求开始生成验证码,具体方法是使用java的图形绘制,以及随机数筛选字母

        将生成好的验证码画到图片上,再将图片与生成的字母返回给前台,前台接收图片显示,用接收的字母与用户的字母进行比对正确与否

分析就到这里了,咱们直接上代码!

首先是验证码生成的java类

编写一个servlet类

resp.setContentType("image/jpeg")是设置文件的类型,因为我们要返回的是图片,所以设置成图片格式

然后定义出我们的图片需要的宽高属性

 用BufferedImage类获得一个画板,属性为(宽,高,颜色格式)

再使用画板得到Graphics画笔

再new一个font字体,属性为(字体类型,字体加粗,字体大小)

将字体设置到画笔上

 我们需要给图片来一个背景

获得到图片的路径,然后用ImageIO将图片读进来,再引进我们要生成的图片上

 new 一个Random随机数

再创建出我们想要随机的字符串

定义空字符串变量方便后面拼接字符串

再定义一个字符变量用于保存随机的字母

 想要多少位的验证码就用for循环多少次

我这里只要5位长度就只循环了5次

定义tempIndex变量接收随机数(从字符串中随机取一个下标)

然后用这个下标tempIndex在字符串template中使用charAr截取字符,就得到了随机出来的字符tempNum

然后将随机出来的字符tempNum拼接到字符串s上

new一个color,设置下随机颜色,类型为(r,g,b)

将颜色给画笔

再将随机的字符tempNum写到画板上,x轴为18*i+5,这里是防止验证的字符重叠,每一位新的验证码都要与之前的保持距离

 最后讲拼接完的字符串s放入session里,让前台知道我们的验证码是多少,才能进行验证

然后创建流 ots,使用ImageIO的write将我们的图片写给前台

到这一步后台就写完了

 前台的话只需要将路径写成我们的servlet类就能获取到图片

 效果图如下:

到此为止代码就写完了,大家可以跟着我的思路自己去试试

实在不懂的话我这里也把源码公布

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;

@WebServlet("/CaptchaDemo")
public class CaptchaDemo extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        //文件类型
        resp.setContentType("image/jpeg");
        //设置缓存
        resp.setHeader("Pragma","no-cache");
        resp.setHeader("Cache-Control","no-cache");
        resp.setDateHeader("Expires",0);

        int width = 100;
        int height = 40;

        //画板
        BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
        //画笔
        Graphics g = image.getGraphics();
        //字体
        Font font = new Font("微软雅黑",Font.BOLD,25);
        //设置字体
        g.setFont(font);

        //获得图片路径
        String imagePath = req.getServletContext().getRealPath("/img/main-banner.jpg");
        Image image1 = ImageIO.read(new File(imagePath));

        //引入背景图片
        g.drawImage(image1,0,0,100,40,null);

        //随机数
        Random random = new Random();
        //要随机的字符串
        String template = "123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        String s = "";
        char tempNum;
        for (int i = 0; i < 5; i++){
            //获取随机出的字符
            int tempIndex = random.nextInt(template.length()-1);
            tempNum = template.charAt(tempIndex);
            //拼成字符串
            s+=tempNum;
            //设置颜色
            Color color = new Color(20+random.nextInt(110),20+random.nextInt(110),random.nextInt(110));
            g.setColor(color);
            //字母写入图片
            g.drawString(String.valueOf(tempNum),18*i+5,25);
        }
        req.getSession().setAttribute("s",s);
        //获取流发送给前台
        ServletOutputStream ots = resp.getOutputStream();
        ImageIO.write(image,"JPEG",ots);
    }
}

下一次会再教大家写另外几种的验证码!

猜你喜欢

转载自blog.csdn.net/hy123154/article/details/128140566
今日推荐