当前位置: 代码网 > it编程>编程语言>Java > SpringBoot实现图形验证码生成的方法

SpringBoot实现图形验证码生成的方法

2025年03月07日 Java 我要评论
这是一个登录页面,在登录的最后一部,很多时候都会让我们输入验证码,今天就来讲讲如何在springboot中实现图形验证码的生成。验证码的生成是一个非常常用的工具类,网上有很多写法。手写验证码首先说明一

这是一个登录页面,在登录的最后一部,很多时候都会让我们输入验证码,今天就来讲讲如何在springboot中实现图形验证码的生成。验证码的生成是一个非常常用的工具类,网上有很多写法。

在这里插入图片描述

手写验证码

首先说明一下,这里的手写,并不是博主自己手写的,而是在github中看到过一个项目,项目中有涉及到一个验证码的源码,感觉还不错。

新建验证码工具类

验证码工具类

public class code {
    public static final string randomcodekey = "validatecode";
    //将图片存放到session中的key

    private random random = new random();//生成随机数

    private string randomstring = "0123456789abcdefghijklmnopqrstuvwxyz";
    //图片中随机产生的字母或数字

    private int width = 80;//图片宽
    private int height = 26;//图片高
    private int linesize = 40;//干扰线数量
    private int stringnum = 4;//随机产生字符数量

    //获得字体
    private font getfont(){
        return new font("fixedsys",font.center_baseline,18);
    }

    //获得随机颜色值
    private color getrandcolor(int fc,int bc){
        if(fc > 255) {
            fc = 255;
        }
        if(bc > 255) {
            bc = 255;
        }
        int r = fc + random.nextint(bc-fc-16);
        int g = fc + random.nextint(bc-fc-14);
        int b = fc + random.nextint(bc-fc-18);
        return new color(r,g,b);
    }

    /*
     * 返回随机的字符
     */
    private string getrandomstring(int num){
        return string.valueof(randomstring.charat(num));
    }

    /*
     * 绘制字符串
     */
    private string drawstring(graphics g, string randomstring, int i){
        g.setfont(getfont());
        g.setcolor(new color(random.nextint(101),random.nextint(111),random.nextint(121)));
        string rand = string.valueof(getrandomstring(random.nextint(this.randomstring.length())));
        randomstring += rand;
        g.translate(random.nextint(3), random.nextint(3));
        g.drawstring(rand, 13 * i, 16);
        return randomstring;
    }

    /*
     * 绘制干扰线
     */
    private void drawline(graphics g){
        int x = random.nextint(width);
        int y = random.nextint(height);
        int xl = random.nextint(13);
        int yl = random.nextint(15);
        g.drawline(x, y, x + xl, y + yl);
    }

    //核心方法:生成随机验证码,并返回
    public void getvalidatecode(httpservletrequest request, httpservletresponse response) {
        httpsession session = request.getsession();
        bufferedimage image = new bufferedimage(width,height,bufferedimage.type_int_bgr);
        graphics g = image.getgraphics();//产生image对象的graphics对象,改对象可以在图像上进行各种绘制操作
        g.fillrect(0, 0, width, height);
        g.setfont(new font("times new roman",font.roman_baseline,18));
        g.setcolor(getrandcolor(110, 133));

        //绘制干扰线
        for(int i = 0;i <= linesize; i++){
            drawline(g);
        }

        //绘制随机字符
        string randomstring = "";
        for(int i = 1; i <= stringnum; i++){
            randomstring = drawstring(g, randomstring, i);
        }

        //将生成的随机字符串装进session作用域
        session.removeattribute(randomcodekey);
        session.setattribute(randomcodekey, randomstring);
        system.out.println(randomstring);//输出生成的随机字符串

        g.dispose();//关闭窗体,释放资源
        try {
            imageio.write(image, "jpeg", response.getoutputstream());//将内存中的图片通过流动形式输出到客户端
        } catch (exception e) {
            e.printstacktrace();
        }
    }
}

springboot项目中新建一个util包,用于存放工具类,这样一个验证码工具类就写好了。

controller中调用

工具类写好后,就可以在controller中调用

    @getmapping("/checkcode2")
    public void checkcode2(httpservletrequest request, httpservletresponse response){
        response.setcontenttype("image/jpeg");
        response.setdateheader("expires",0);
        response.setheader("pragma","no-cache");
        response.setheader("cache-control","no-cache");
        //引用验证码工具类,生成验证码
        code code=new code();
        code.getvalidatecode(request,response);
    }
  • @getmapping("/checkcode2"): 这是一个spring mvc注解,表示当客户端发送一个get请求到/checkcode2路径时,将调用checkcode2方法。
  • public void checkcode2(httpservletrequest request, httpservletresponse response): 这是一个控制器方法,接收httpservletrequest和httpservletresponse对象作为参数,用于处理http请求和响应。
  • response.setcontenttype("image/jpeg");: 设置响应的内容类型为jpeg格式的图片。
  • response.setdateheader("expires",0);: 设置响应头expires为0,表示页面内容已过期,浏览器应当每次都从服务器获取最新内容。
  • response.setheader("pragma","no-cache");: 设置响应头pragma为no-cache,指示浏览器不要缓存页面内容。
  • response.setheader("cache-control","no-cache");: 设置响应头cache-control为no-cache,进一步指示浏览器不要缓存页面内容。
  • code code=new code();: 创建一个code类的实例。
  • code.getvalidatecode(request,response);: 调用code实例的getvalidatecode方法,生成验证码并将其写入响应中。

apifox中验证

在这里插入图片描述

hutool图形验证码

hutool官网:https://www.hutool.cn/docs/#/

正如官网简介所言,hutool是一个小而全的java工具类库,它提供了很多常用的工具类,几乎包罗万象。

在这里插入图片描述

今天我们使用的是hutool-captcha(图形验证码)。

引入依赖

这里使用的是maven,如果是其他的项目构建工具,请参考文档。

单独引入图形验证码的依赖模块

    <!-- 添加图形验证码依赖 -->
    <dependency>
      <groupid>cn.hutool</groupid>
      <artifactid>hutool-captcha</artifactid>
      <version>5.8.6</version>
    </dependency>

当然,为了方便,也可以按照文档中的方法,引入所有模块。

<dependency>
    <groupid>cn.hutool</groupid>
    <artifactid>hutool-all</artifactid>
    <version>5.8.16</version>
</dependency>

在这里插入图片描述

linecaptcha:线段干扰的验证码

    @getmapping("/checkcode1")
    public void checkcode(httpservletresponse response) throws ioexception {
        //调用hutool的图形验证码
        linecaptcha captcha = captchautil.createlinecaptcha(130, 38, 5, 5);
        //指示浏览器不要缓存页面内容
        response.setheader("pragma","no-cache");
        //进一步指示浏览器不要缓存页面内容
        response.setheader("cache-control","no-cache");
        //表示页面内容已过期,浏览器应当每次都从服务器获取最新内容
        response.setdateheader("expires",0);
        //表示返回的内容为jpeg格式的图片
        response.setcontenttype("image/jpeg");

        //图片验证码写出
        captcha.write(response.getoutputstream());
        //关闭流
        response.getoutputstream().close();
    }
  • linecaptcha captcha = captchautil.createlinecaptcha(130, 38, 5, 5);
    定义图形验证码的长、宽、验证码字符数、干扰线宽度
  • linecaptcha captcha = captchautil.createlinecaptcha(130, 38)
    定义图形验证码的长、宽

上面这两种写法都是可以的

在这里插入图片描述

circlecaptcha:圆形干扰验证码

 @getmapping("/checkcode1")
    public void checkcode(httpservletresponse response) throws ioexception {
        //调用hutool的图形验证码
        circlecaptcha captcha = captchautil.createcirclecaptcha(130, 38, 5, 20);
        //指示浏览器不要缓存页面内容
        response.setheader("pragma","no-cache");
        //进一步指示浏览器不要缓存页面内容
        response.setheader("cache-control","no-cache");
        //表示页面内容已过期,浏览器应当每次都从服务器获取最新内容
        response.setdateheader("expires",0);
        //表示返回的内容为jpeg格式的图片
        response.setcontenttype("image/jpeg");

        //图片验证码写出
        captcha.write(response.getoutputstream());
        //关闭流
        response.getoutputstream().close();
    }
  • circlecaptcha captcha = captchautil.createcirclecaptcha(130, 38, 5, 20);
    定义图形验证码的长、宽、验证码字符数、干扰⭕个数
  • circlecaptcha captcha = captchautil.createcirclecaptcha(130, 38);
    定义图形验证码的长、宽

圆形干扰验证码同样两种写法。

在这里插入图片描述

shearcaptcha:扭曲干扰验证码

    @getmapping("/checkcode1")
    public void checkcode(httpservletresponse response) throws ioexception {
        //调用hutool的图形验证码
        shearcaptcha captcha = captchautil.createshearcaptcha(130, 38,5,5);
        //指示浏览器不要缓存页面内容
        response.setheader("pragma","no-cache");
        //进一步指示浏览器不要缓存页面内容
        response.setheader("cache-control","no-cache");
        //表示页面内容已过期,浏览器应当每次都从服务器获取最新内容
        response.setdateheader("expires",0);
        //表示返回的内容为jpeg格式的图片
        response.setcontenttype("image/jpeg");

        //图片验证码写出
        captcha.write(response.getoutputstream());
        //关闭流
        response.getoutputstream().close();
    }
  • shearcaptcha captcha = captchautil.createshearcaptcha(130, 38,5,5);
    定义图形验证码的长、宽、验证码字符数、干扰线宽度
  • shearcaptcha captcha = captchautil.createshearcaptcha(130, 38);
    定义图形验证码的长、宽

在这里插入图片描述

gifcaptcha:gif验证码

 @getmapping("/checkcode1")
    public void checkcode(httpservletresponse response) throws ioexception {
        //调用hutool的图形验证码
        gifcaptcha captcha = captchautil.creategifcaptcha(130, 38,5);
        //指示浏览器不要缓存页面内容
        response.setheader("pragma","no-cache");
        //进一步指示浏览器不要缓存页面内容
        response.setheader("cache-control","no-cache");
        //表示页面内容已过期,浏览器应当每次都从服务器获取最新内容
        response.setdateheader("expires",0);
        //表示返回的内容为jpeg格式的图片
        response.setcontenttype("image/jpeg");

        //图片验证码写出
        captcha.write(response.getoutputstream());
        //关闭流
        response.getoutputstream().close();
    }
  • gifcaptcha captcha = captchautil.creategifcaptcha(130, 38,5);
    定义gif验证码的长、宽、验证码字符数
  • gifcaptcha captcha = captchautil.creategifcaptcha(130, 38);
    定义gif验证码的长、宽

大家可以去试试,这里截不出那种gif的效果

在这里插入图片描述

在这里插入图片描述

自定义验证码

在这里插入图片描述

纯数字验证码

    @getmapping("/checkcode1")
    public void checkcode(httpservletresponse response) throws ioexception {
        // 自定义纯数字的验证码(随机4位数字,可重复)
        randomgenerator randomgenerator = new randomgenerator("0123456789", 4);
        linecaptcha captcha = captchautil.createlinecaptcha(200, 100);
        captcha.setgenerator(randomgenerator);
// 重新生成code
        captcha.createcode();
        //指示浏览器不要缓存页面内容
        response.setheader("pragma","no-cache");
        //进一步指示浏览器不要缓存页面内容
        response.setheader("cache-control","no-cache");
        //表示页面内容已过期,浏览器应当每次都从服务器获取最新内容
        response.setdateheader("expires",0);
        //表示返回的内容为jpeg格式的图片
        response.setcontenttype("image/jpeg");

        //图片验证码写出
        captcha.write(response.getoutputstream());
        //关闭流
        response.getoutputstream().close();
    }

在这里插入图片描述

当然除了linecaptcha,circlecaptcha,gifcaptcha,shearcaptcha都是可以的

纯字母验证码

    @getmapping("/checkcode1")
    public void checkcode(httpservletresponse response) throws ioexception {
        // 自定义纯数字的验证码(随机4位数字,可重复)
        randomgenerator randomgenerator = new randomgenerator("abcdefghijklmnopqrstuvwyzx", 4);
        circlecaptcha captcha = captchautil.createcirclecaptcha(200, 100);
        captcha.setgenerator(randomgenerator);
// 重新生成code
        captcha.createcode();
        //指示浏览器不要缓存页面内容
        response.setheader("pragma","no-cache");
        //进一步指示浏览器不要缓存页面内容
        response.setheader("cache-control","no-cache");
        //表示页面内容已过期,浏览器应当每次都从服务器获取最新内容
        response.setdateheader("expires",0);
        //表示返回的内容为jpeg格式的图片
        response.setcontenttype("image/jpeg");

        //图片验证码写出
        captcha.write(response.getoutputstream());
        //关闭流
        response.getoutputstream().close();
    }

在这里插入图片描述

四则运算验证码

 @getmapping("/checkcode1")
    public void checkcode(httpservletresponse response) throws ioexception {
        shearcaptcha captcha = captchautil.createshearcaptcha(200, 45, 4, 4);
        // 自定义验证码内容为四则运算方式
        captcha.setgenerator(new mathgenerator());
        // 重新生成code
        captcha.createcode();
        //指示浏览器不要缓存页面内容
        response.setheader("pragma","no-cache");
        //进一步指示浏览器不要缓存页面内容
        response.setheader("cache-control","no-cache");
        //表示页面内容已过期,浏览器应当每次都从服务器获取最新内容
        response.setdateheader("expires",0);
        //表示返回的内容为jpeg格式的图片
        response.setcontenttype("image/jpeg");

        //图片验证码写出
        captcha.write(response.getoutputstream());
        //关闭流
        response.getoutputstream().close();
    }

在这里插入图片描述

以上就是springboot实现图形验证码生成的方法的详细内容,更多关于springboot图形验证码生成的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com