前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >图像验证码

图像验证码

作者头像
是小张啊喂
发布2021-08-09 17:36:24
发布2021-08-09 17:36:24
1.2K00
代码可运行
举报
文章被收录于专栏:软件软件
运行总次数:0
代码可运行

无意之中发现一个好玩的东西,那就是生成验证码图片,感觉还挺好玩的。意外看到 kaptcha

项目是 github 开源的,具体的项目源码细节自行参考 来看一下这个神奇的东西吧

依赖

代码语言:javascript
代码运行次数:0
运行
复制
<dependency>
  <groupId>com.github.penggle</groupId>
  <artifactId>kaptcha</artifactId>
  <version>2.3.2</version>
</dependency>

只需要这个一个依赖即可

在生成之前,只需要配置一个图片生成器就可以了Producer,别人自己叫负责创建带有在其上绘制的文本的验证码图像。搞那么复杂干嘛是不是,直接操作他就完了,费了个劲的。

这个里面只有两个方法,首先是 创建将写入扭曲文本的图像。 createImage(String text)

还有一个就是要绘制的文本 createText()

创建kaptcha实例

代码语言:javascript
代码运行次数:0
运行
复制
/**
 * 配置 kaptcha 实例
 *
 * @return 图形创建者
 */
@Bean
public Producer captcha() {
    // 配置 图形眼正码的基本参数
    Properties properties = new Properties();
    // 图片的宽度
    properties.setProperty("kaptcha.image.width", "150");
    // 图片的长度
    properties.setProperty("kaptcha.image.height", "50");
    // 字符集
    properties.setProperty("kaptcha.textproducer.char.String", "0123456789");
    // 字符长度
    properties.setProperty("kaptcha.textproducer.char.length", "4");
    Config config = new Config(properties);
    // 使用默认的图形眼正码实现 可自定义实现
    DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
    defaultKaptcha.setConfig(config);
    return defaultKaptcha;
}

生成图片

代码语言:javascript
代码运行次数:0
运行
复制
@Autowired
private Producer producer;

/**
  * 生成图片
  *
  * @param request
  * @param response
  */
@GetMapping("captcha.jpg")
public void getCaptcha(HttpServletRequest request, HttpServletResponse response) {
    // 设置内容类型
    response.setContentType("image/jpeg");
    // 创建验正码文本
    String capText = producer.createText();
    // 将验正码文本设置到 session 中
    request.getSession().setAttribute("captcha", capText);
    // 创建验证码图片
    BufferedImage bufferedImage = producer.createImage(capText);
    // 获取响应的输出流
    try {
        @Cleanup ServletOutputStream outputStream = response.getOutputStream();
        // 将图片验证码数据写到响应的输出流
        ImageIO.write(bufferedImage, "jpg", outputStream);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

一般像Huttol也有相应的工具类,例如Hutool自定义验证码

上面的是一种,但是偶然发现 GitHub 提示可能会有安全隐患之类的,那我们看一下 Hutool是如何实现的,换汤不换药,只需要修改请求的接口即可,这里就只单纯的演示一下线段干扰的验证码

生成图片

代码语言:javascript
代码运行次数:0
运行
复制
/**
 * 生成图片
 *
 * @param request
 * @param response
 */
@GetMapping("captcha.jpg")
public void getCaptcha(HttpServletRequest request, HttpServletResponse response) {
        // 设置内容类型
        response.setContentType("image/jpeg");
        //定义图形验证码的长和宽
        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);
        // 将验正码文本设置到 session 中
        request.getSession().setAttribute("captcha", lineCaptcha.getCode());
        BufferedImage image = lineCaptcha.getImage();
        try {
            @Cleanup ServletOutputStream outputStream = response.getOutputStream();
            // 将图片验证码数据写到响应的输出流
            ImageIO.write(image, "jpg", outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
}

对于这种图形验证码,各自有各自的看法吧,闲着也是闲着,为后面的图形验证做一下准备,验证码已存在于session中,验证时,只需要对传递过来的验证码正文进行校验即可。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-02-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 依赖
  • 创建kaptcha实例
  • 生成图片
  • 生成图片
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档