Java 生成图片验证码

图片验证码使用场景

  • 登录注册:可以区分机器和人类的一种手段,其最大的作用是为了防止机器人程序暴力登录或攻击
  • 短信发送:可以有效避免客户网站或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,齐活~,上效果

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
获取图片验证码的值分为两个步骤: 1. 识别验证码图片中的字符 2. 将字符组合成验证码的值 下面是基于Java和OpenCV实现的简单示例代码: ```java import org.opencv.core.*; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; public class CaptchaRecognition { public static void main(String[] args) { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); // 读取验证码图片 Mat captcha = Imgcodecs.imread("captcha.png", Imgcodecs.IMREAD_GRAYSCALE); // 对图片进行二值化处理,将字符部分变为黑色,背景部分变为白色 Imgproc.threshold(captcha, captcha, 0, 255, Imgproc.THRESH_BINARY_INV | Imgproc.THRESH_OTSU); // 对图片进行腐蚀操作,使字符之间的间隙更明显 Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3, 3)); Imgproc.erode(captcha, captcha, kernel); // 查找图片中的轮廓 Mat hierarchy = new Mat(); Mat contours = captcha.clone(); Imgproc.findContours(contours, new ArrayList<Mat>(), hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); // 遍历轮廓,获取字符的位置和大小 ArrayList<Rect> charRects = new ArrayList<>(); for (int i = 0; i < contours.rows(); i++) { Rect rect = Imgproc.boundingRect(contours.row(i)); if (rect.width >= 5 && rect.height >= 10 && rect.width * rect.height < captcha.size().area() / 5) { charRects.add(rect); } } // 将字符按照从左到右的顺序排序 charRects.sort((o1, o2) -> Integer.compare(o1.x, o2.x)); // 识别字符 StringBuilder captchaValue = new StringBuilder(); for (Rect rect : charRects) { Mat charImage = captcha.submat(rect); // TODO: 使用OCR技术对charImage进行识别,将识别结果添加到captchaValue中 } // 输出验证码值 System.out.println(captchaValue.toString()); } } ``` 其中,使用OCR技术对字符进行识别需要使用第三方库或API,例如Tesseract OCR、百度OCR等。具体使用方法可以参考官方文档或相关资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序猿小张丶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值