`

验证码服务

阅读更多
<dependency>
	<groupId>com.github.penggle</groupId>
	<artifactId>kaptcha</artifactId>
	<version>2.3.2</version>
</dependency>


import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import org.apache.commons.collections4.map.PassiveExpiringMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Service;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.TimeUnit;

/**
 * @author Kelvin范显
 * @createDate 2018年11月15日
 */
@Service
public class CaptchaServiceImpl implements CaptchaService,InitializingBean {
    private Logger logger = LoggerFactory.getLogger(getClass());

    // msg
    final static String MSG_TIMEOUT = "验证码已过期";
    final static String MSG_FAILED = "验证码生成失败";

    //config
    private int minutesToLive=3;
    private String imgFormat="png";

    private DefaultKaptcha producer;
    private Map<String,String> captchaMap = Collections.synchronizedMap(
            new PassiveExpiringMap(minutesToLive,TimeUnit.MINUTES,new HashMap<>()));

    @Override
    public void afterPropertiesSet() {
        producer = new DefaultKaptcha();
        producer.setConfig(new Config(new Properties()));
    }

    @Override
    public String generateCaptchaKey() throws CaptchaException {
        String key = UUID.randomUUID().toString();
        captchaMap.put(key, producer.createText());
        return key;
    }

    @Override
    public byte[] generateCaptchaImage(String captchaKey) throws CaptchaException {
        String text = Optional.ofNullable(captchaMap.get(captchaKey))
                .orElseThrow(()->new CaptchaException(MSG_TIMEOUT));
        BufferedImage image = producer.createImage(text);
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try{
            ImageIO.write(image, imgFormat, out);
        }catch(IOException e){
            logger.error(MSG_FAILED,e);
            throw new CaptchaException(MSG_FAILED,e);
        }
        return out.toByteArray();
    }

    @Override
    public boolean validateCaptcha(String captchaKey, String captchaValue) throws CaptchaException {
        if(Optional.ofNullable(captchaMap.get(captchaKey)).orElseThrow(()->new CaptchaException(MSG_TIMEOUT))
                .equalsIgnoreCase(captchaValue)){
            captchaMap.remove(captchaKey);
            return true;
        }
        return false;
    }
}



@RestController
@RequestMapping("/captcha")
public class CaptchaController {

    final CaptchaService captchaService;

    public CaptchaController(CaptchaService captchaService) {
        this.captchaService = captchaService;
    }

    @GetMapping
    public ResponseEntity getImgCaptcha(){
        Map map= new HashMap();
        map.put("key", captchaService.generateCaptchaKey());
        map.put("img",  "data:image/png;base64,"+Base64.encodeBase64String(
                captchaService.generateCaptchaImage(map.get("key").toString())));
        return ResponseEntity.ok(map);
    }
}
分享到:
评论

相关推荐

    国际验证码API接口

    以下将详细介绍ihuyi提供的国际验证码服务及其相关知识点: 1. **API接口**:API(Application Programming Interface)是软件之间交互的一种方式,它定义了不同系统之间数据交换的规则。ihuyi的国际验证码API是一...

    Go-Packagecaptcha为Macaron提供验证码服务

    开发者可以通过简单的几行代码将验证码服务插入到路由处理流程中。 4. **存储与验证**:`Package captcha`不仅生成验证码,还负责将其存储在服务器端,并提供接口供前端验证用户输入的验证码。通常,这些数据可以暂...

    短信验证码服务(阿里云-云通信) Go语言开发.zip

    短信验证码服务介绍 短信验证码是一种安全验证机制,用于确认用户身份,防止恶意攻击和欺诈行为。阿里云的云通信服务提供了稳定、快速的短信发送能力,支持国际/国内短信发送,适用于注册、登录、支付等多种场景。 ...

    爱码验证码飞Q验证码手机验证码模块

    本模块结合了“爱码”和“飞Q”这两个知名的验证码服务平台,提供了一种更便捷的方式来处理手机验证码的需求。 “爱码验证码”是一个专业的验证码服务提供商,它提供了多种类型的验证码解决方案,包括图形验证码、...

    【纯前端】微信小程序验证码

    2. 第三方服务:也可以采用第三方验证码服务提供商,如阿里云的滑动验证码、腾讯云的点选验证码等,通过API接入,减少自建服务的复杂性。 四、小程序端获取验证码 1. 点击触发:在需要验证码的页面,设置一个按钮,...

    测试中去掉登录验证码

    查找相关配置项,如`application.properties`或`yaml`文件,临时禁用验证码服务。 4. **接口绕过**:如果验证码是通过API接口获取和验证的,可以模拟这个接口,返回预设的正确验证码,跳过实际的验证过程。 5. **...

    在Vue项目中引入腾讯验证码服务的教程

    Vue 项目中引入腾讯验证码服务教程 本教程主要介绍了在 Vue 项目中引入腾讯验证码服务的步骤和实现方法,旨在帮助开发者快速掌握腾讯验证码服务的使用。 一、什么是腾讯验证码? 腾讯验证码是一种验证码服务,...

    谷歌kaptcha验证码jar包

    谷歌Kaptcha验证码jar包是Google提供的一种用于网页安全验证的工具。Kaptcha,源自马来语“cap”,意为“图片”,是一种开源项目,主要用于生成难以被机器识别的图像验证码,以此来防止自动化程序(如机器人)对网站...

    vue+springboot+redis+kaptcha实现登录验证码

    2. 创建验证码服务:编写一个服务类,使用Kaptcha生成验证码,并将其文本存储到Redis,同时返回图像给前端。 3. 前端Vue组件:创建一个Vue组件,用于显示验证码图片,并提供刷新验证码和提交验证码的功能。使用...

    安卓验证码相关-第三方验证码免费简单详细Android.zip

    本资源"安卓验证码相关-第三方验证码免费简单详细Android.zip"提供了一些关于如何在Android平台上集成第三方验证码服务的资料。下面将详细介绍验证码在Android中的应用和相关知识点。 首先,验证码的种类主要有图像...

    java web加法验证码实例

    在Spring中,我们可以配置一个Bean来代表验证码服务,然后在Struts2 Action中注入这个服务,以便获取和验证验证码。在Hibernate中,虽然通常不需要直接与验证码交互,但如果有存储用户验证历史需求,我们可以利用...

    登陆页面随机验证码

    8. **验证码服务**:有些大型网站会使用第三方验证码服务,如Google的reCAPTCHA,它们通常能提供更高级的防护机制,同时减少误判率。 验证码技术随着技术的发展也在不断演进,例如,现在有一些基于行为分析的验证码...

    js 验证码.rarjs 验证码.rarjs 验证码.rarjs 验证码.rarjs 验证码.rarjs 验证码.rarjs 验证码.rarjs 验证码.rarjs 验证码.rar

    9. **验证码服务集成**:一些网站会选择第三方的验证码服务,如Google的reCAPTCHA,这些服务提供了更高级的验证方式,如无感验证,同时它们通常有更强的防爬能力。 10. **移动端适配**:对于移动设备,JavaScript...

    第三方验证码

    2. **发送验证码**:系统将这个手机号码发送给第三方验证码服务提供商,如Authy、Twilio、Nexmo等。服务提供商随即生成一个随机的OTP,并通过短信发送到该手机号码。 3. **接收验证码**:用户在收到短信后,在应用...

    验证码生产jar包

    Java验证码库`jcaptcha`提供了丰富的功能,帮助开发者轻松地在他们的应用程序中集成验证码服务。以下是一些关于`jcaptcha`的关键知识点: 1. **生成算法**:`jcaptcha`库使用了复杂的图像生成算法,可以创建难以被...

    阿里云(验证码)

    阿里云短信验证码服务基于云计算平台,通过分布式架构处理大规模请求,确保服务的稳定性和高可用性。它采用加密算法保证数据传输的安全性,防止验证码被截获或篡改。此外,服务还具有智能防护机制,可以抵御恶意...

    Discuz!X3.5 X3.4腾讯云验证码插件 1.0.0.zip

    这款插件的核心功能是集成腾讯云的验证码服务,为Discuz! 用户带来更高效、安全的验证体验。 腾讯云验证码服务是一种基于云的智能验证解决方案,它通过先进的机器学习算法来抵御自动化攻击,如机器人和垃圾邮件。...

    图片验证码

    7. **验证码API**:在实际应用中,开发者可能会使用现成的验证码服务API,如Google的reCAPTCHA,它们提供了强大的安全性和良好的用户体验,同时减轻了开发者的负担。 8. **验证机制**:当用户输入验证码后,服务器...

    asp验证码代码

    - 使用更高级的验证码服务,如reCAPTCHA,它利用谷歌的人工智能技术,既能有效防止机器人,又能减少对用户输入的依赖。 综上所述,"asp验证码代码"是一个关于ASP.NET环境下实现验证码功能的例子,涵盖了验证码的...

Global site tag (gtag.js) - Google Analytics