Java 生成图片验证码

文章介绍了如何在登录注册场景中使用图片验证码来区分机器和人类,防止暴力登录或攻击。通过添加Easy-Captcha的Maven依赖,创建获取验证码的接口,设置响应头,实现验证码的创建和存储,并配置验证码的属性,如有效期、类型、尺寸等,以确保验证码的安全性和有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图片验证码使用场景

  • 登录注册:可以区分机器和人类的一种手段,其最大的作用是为了防止机器人程序暴力登录或攻击
  • 短信发送:可以有效避免客户网站或APP遭到恶意攻击、预防资金损失

实现方式

1.添加Maven依赖

	   <dependency>
            <groupId>com.github.whvcse</groupId>
            <artifactId>easy-captcha</artifactId>
            <version>1.6.2</version>
        </dependency>

2.添加获取图片验证码接口

	@ApiOperation("获取图片验证码")
    @GetMapping("/captcha")
    public void captcha(HttpServletRequest request, HttpServletResponse response) {
        commService.create(request, response);
    }

注意:获取图片验证码时需要再请求地址后面加个参数key,key需保持唯一

3.实现方法

 	@Override
    public void create(HttpServletRequest request, HttpServletResponse response) {
        String key = request.getParameter("key");
        if (StringUtils.isBlank(key)) {
            throw new NingException(500,"请输入key码");
        }
        ValidateCodeProperties code = new ValidateCodeProperties();
        setHeader(response, code.getType());
        Captcha captcha = createCaptcha(code);
        // 把验证码存进缓存中
        dataCache.setCacheImageValidCode(key, StringUtils.lowerCase(captcha.text()));
        try {
            captcha.out(response.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
            throw new NingException(500,"图形验证码生成失败,请稍后再试!");
        }
    }

	  private Captcha createCaptcha(ValidateCodeProperties code) {
        Captcha captcha = null;
        if (StringUtils.equalsIgnoreCase(code.getType(), "gif")) {
            captcha = new GifCaptcha(code.getWidth(), code.getHeight(), code.getLength());
        } else {
            captcha = new SpecCaptcha(code.getWidth(), code.getHeight(), code.getLength());
        }
        captcha.setCharType(code.getCharType());
        return captcha;
    }

	 private void setHeader(HttpServletResponse response, String type) {

        if (StringUtils.equalsIgnoreCase(type, "gif")) {
            response.setContentType(MediaType.IMAGE_GIF_VALUE);
        } else {
            response.setContentType(MediaType.IMAGE_PNG_VALUE);
        }
        response.setHeader(HttpHeaders.PRAGMA, "No-cache");
        response.setHeader(HttpHeaders.CACHE_CONTROL, "no-cache");
        response.setDateHeader(HttpHeaders.EXPIRES, 0L);
    }

3.图片验证码配置类

@Data
public class ValidateCodeProperties {
    /**
     * 验证码有效时间,单位秒
     */
    private Long time = 120L;
    /**
     * 验证码类型,可选值 png和 gif
     */
    private String type = "png";
    /**
     * 图片宽度,px
     */
    private Integer width = 130;
    /**
     * 图片高度,px
     */
    private Integer height = 48;
    /**
     * 验证码位数
     */
    private Integer length = 4;
    /**
     * 验证码值的类型
     * 1. 数字加字母
     * 2. 纯数字
     * 3. 纯字母
     */
    private Integer charType = 2;
}

5.OK,齐活~,上效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿小张丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值