dustlight-cn / captcha

CAPTCHA 是一个基于 Spring Boot 框架的验证码框架,它通过 AOP 的方式完成包含验证码生成、发送、存储等验证码相关业务,以避免与业务代码耦合。目前提供邮箱验证码、短信验证码、图像验证码、谷歌 reCAPTCHA。
https://dustlight-cn.github.io/captcha/
Apache License 2.0
30 stars 6 forks source link

邮箱验证码报错 #7

Closed wantsingZhang closed 3 years ago

wantsingZhang commented 3 years ago

按照邮箱验证码的入门教程做 报错
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'emailCodeSender' available at cn.dustlight.captcha.Util.getBean(Util.java:18) ~[captcha-core-1.0.0.jar:na] at cn.dustlight.captcha.core.SendCodeInterceptor.before(SendCodeInterceptor.java:48) ~[captcha-core-1.0.0.jar:na]

wantsingZhang commented 3 years ago

图片验证码部分可不可以只生成和储存code,不发送?

Hansin1997 commented 3 years ago

邮箱验证码问题

你好,邮箱验证码报错的原因是因为 JavaMailSender 的约束不满足,导致 emailCodeSender Bean 没有被创建,现在已经修复。 请过几个小时,等待中央仓库同步完成,将版本升级至 1.0.1 即可。

图片验证码问题

至于图片验证码部分,虽然我不明白你为什么要这样做,不过是可以的。以下是步骤:

1. 创建自定义发送器

package com.example.captchademo;

import cn.dustlight.captcha.configurations.SimpleImageCodeSenderConfiguration;
import cn.dustlight.captcha.core.Code;
import cn.dustlight.captcha.sender.CodeSender;
import cn.dustlight.captcha.sender.SendCodeException;
import cn.dustlight.captcha.sender.SimpleImageCodeSender;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Map;

@Component("mySender")
public class MySender implements CodeSender<String> {

    @Autowired
    SimpleImageCodeSender imageCodeSender; // 原先的图片发送器

    @Autowired
    SimpleImageCodeSenderConfiguration.SimpleImageCodeSenderProperties properties; // 图片发送器的配置

    @Override
    public void send(Code<String> code, Map<String, Object> parameters) throws SendCodeException {

        // 使用图片发送器中的 ImageHandler 生成图片
        BufferedImage image = imageCodeSender.getImageHandler()
                .getImage(code.getValue(),
                        properties.getWidth()
                        , properties.getHeight(),
                        parameters);

        try {
            // 然后再将图片存到自定义的位置,如 "captcha.jpg"
            ImageIO.write(image, "jpg", new File("captcha.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2. 使用自定义的发送器

    @RequestMapping("/test")
    @SendCode(sender = @Sender("mySender")) // 使用自定义发送器 "mySender"
    public void test(@CodeValue String code) {

    }
wantsingZhang commented 3 years ago

感谢解答!!!

图片验证码问题是因为邮箱验证报错,之前做过邮件发送demo,有源码, 验证码的话想用图片验证码生成的code发送替代,然后发现@SendCode一定会返回图片,没有找到办法处理 最后搞了个6位随机数然后存session基本解决了。

Hansin1997 commented 3 years ago

验证码有效时间设置

    @RequestMapping("/test")
    @SendCode(duration = @Duration(1000 * 60 * 5L)) // 设置有效时间为 5 分钟 (单位为毫秒)
    public void test(@CodeValue String code) {

    }
wantsingZhang commented 3 years ago

多谢解答!

Hansin1997 commented 3 years ago

不用客气 😀

可能今天晚点,最迟明天,1.0.1 版本就能同步到各仓库了。如果急着用可以先引用 1.0.1-SNAPHOST 版本。