SpringBoot整合验证码

418 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第18天,点击查看活动详情

验证码介绍

在日常上网的时候经常会看到验证码的逻辑设计,比如登录账号、论坛发帖、抢购商品等都会要求用户输入验证码。验证码的生成规则或者展现形式也各不相同。

 验证码的形式

  1. 传统输入式验证码

    该实现方式比较简单,一般以图片形式呈现给用户,其中的字符通常由数字、字母混合组成,也有单纯使用数字或字母的。为了提高用户的识别难度系统可能提供数学运算表达式,或者在图片背景中添加干扰线等。

  2. 手机短信验证码

用户填写手机号获取验证码,然后输入收到的短信验证码进行验证,验证成功才能登陆

相较于传统输入式验证码,该方式多了填写手机号的步骤。在系统开发过程中也需要对接短信服务系统并向运营商支付相应的短信费用,所以会更复杂一些。此外,如果短信接收不及时也会影响用户的体验。但是这种方式不仅包含了验证码的基础功能,可以防止恶意的注册和登录,同时也能够对手机号码的真实性进行校验,一举多得。

  1. 滑块类型验证码

滑块类型验证码是非常有创意的验证码形式,实现方式有滑块和轨迹线。用户需要识别并拖动滑块到指定位置或者根据验证码中的轨迹线沿着轨迹划线,最终完成验证操作

Spring Boot整合easy-captcha生成验证码

生成验证码的方式和案例有很多,传统输入式验证码,所选择的实现方案是easy-captcha工具包

快速入门

1.添加依赖


<dependencies>

   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
   </dependency>

   <!-- 验证码 -->
   <dependency>
      <groupId>com.github.whvcse</groupId>
      <artifactId>easy-captcha</artifactId>
      <version>1.6.2</version>
   </dependency>

   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
      <exclusions>
         <exclusion>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
         </exclusion>
      </exclusions>
   </dependency>
</dependencies>

easy-captcha验证码字符类型

image.png


SpecCaptcha captcha = new SpecCaptcha(130, 48, 5);
captcha.setCharType(Captcha.TYPE_ONLY_NUMBER);

字体设置

image.png

// 生成验证码对象
SpecCaptcha captcha = new SpecCaptcha(130, 48, 5); 
// 设置验证码字体为内置字体 1 
captcha.setFont(Captcha.FONT_1);
// 设置设置验证码字体为系统字体
captcha.setFont(new Font("楷体", Font.PLAIN, 28));

easy-captcha验证码图片输出

输出到文件流如下所示:

// 输出到磁盘上
FileOutputStream outputStream = new FileOutputStream(new File("/home/project/captcha.png"));
SpecCaptcha specCaptcha = new SpecCaptcha(130, 48, 5);
specCaptcha.out(outputStream);

该段代码为生成一张图片并保存到磁盘目录中,这里可以使用easy-captcha工具自带的.out()方法输出。而在开发Web项目时,则会使用Response对象的输出流进行验证码的输出解。

easy-captcha工具自带的.out()方法输出

@Controller
public class CaptchaController {
    
    @RequestMapping("/captcha")
    public void captcha(HttpServletRequest request, HttpServletResponse response) throws Exception {
        CaptchaUtil.out(request, response);
    }
}