欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

验证码服务

程序员文章站 2022-06-23 17:28:03
...
<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);
    }
}
相关标签: java 验证码