Heim  >  Artikel  >  Java  >  So implementieren Sie Verifizierungscode mit SpringBoot+kaptcha

So implementieren Sie Verifizierungscode mit SpringBoot+kaptcha

WBOY
WBOYnach vorne
2023-05-25 14:25:221589Durchsuche

1. Grundlegende Verwendung

kaptcha ist ein sehr altes Tool zur Generierung von Bestätigungscodes. Aus dem Jahr 2006.

Nach so vielen Jahren ist es nicht nur nicht einsam, sondern wird auch immer noch von vielen Menschen genutzt, was ausreicht, um seine Vitalität zu zeigen und unserer Untersuchung wert ist.

Der Einfachheit halber erstellen wir ein Spring Boot-Projekt, um seine Verwendung zu demonstrieren.

Erstellen Sie zunächst ein neues Spring Boot-Projekt und fügen Sie dann die Abhängigkeit von Kaptcha wie folgt hinzu:

<dependency>
  <groupId>com.github.penggle</groupId>
  <artifactId>kaptcha</artifactId>
  <version>2.3.2</version>
</dependency>

Als nächstes müssen wir nur noch eine Bean bereitstellen, um Kaptcha wie folgt zu konfigurieren:

@Configuration
public class KaptchaConfig {
    @Bean(name = "captchaProducer")
    public DefaultKaptcha getKaptchaBean() {
        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
        Properties properties = new Properties();
        // 是否有边框 默认为true 我们可以自己设置yes,no
        properties.setProperty(KAPTCHA_BORDER, "yes");
        // 验证码文本字符颜色 默认为Color.BLACK
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black");
        // 验证码图片宽度 默认为200
        properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160");
        // 验证码图片高度 默认为50
        properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");
        // 验证码文本字符大小 默认为40
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38");
        // KAPTCHA_SESSION_KEY
        properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode");
        // 验证码文本字符长度 默认为5
        properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4");
        // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier");
        // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy
        properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy");
        Config config = new Config(properties);
        defaultKaptcha.setConfig(config);
        return defaultKaptcha;
    }
}

Konfigurieren Sie jeden Attributwert der Überprüfung Codebild in DefaultKaptcha. Die Bedeutung jedes Attributs wird im Code kommentiert, daher werde ich nicht mehr sagen.

Als nächstes geben wir das Bestätigungscode-Bild in der Schnittstelle zurück, wie folgt:

@Autowired
DefaultKaptcha defaultKaptcha;
@GetMapping("/img")
public void getKaptcha(HttpServletResponse resp) throws IOException {
    String text = defaultKaptcha.createText();
    BufferedImage image = defaultKaptcha.createImage(text);
    ImageIO.write(image, "jpg", resp.getOutputStream());
}

Ich schreibe das Bild in Form eines IO-Streams an das Frontend. Natürlich kann es auch in einen Base64-String umgewandelt und an das zurückgegeben werden Frontend. Das Gleiche gilt.

Warten Sie, etwas scheint zu fehlen!

Wir haben den generierten Bestätigungscode-Text nicht in der Sitzung gespeichert, sodass er beim Anmelden nicht überprüft werden kann. Einige Freunde fragen sich vielleicht: Ist das nicht einfach? Reicht es nicht, es in der Benutzeroberfläche zu speichern?

NONONO!

Schauen Sie, wenn wir die DefaultKaptcha-Bean konfigurieren, gibt es eine Codezeile properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode"); Diese Codezeile bedeutet, dass die generierte Überprüfung automatisch erfolgt Der Code Text wird in der Sitzung gespeichert und der SCHLÜSSEL der Sitzung ist kaptchaCode. Bei tatsächlichen Tests werden Sie jedoch feststellen, dass der obige Code den durch den Bestätigungscode generierten Text nicht in der Sitzung speichert. properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode");,这行代码的意思就是说会自动将生成的验证码文本存入到 session 中,并且 session 的 KEY 是 kaptchaCode。但是在实际测试中,大家会发现上面的代码并不会将验证码生成的文本存入到 session 中。

原因在于 Kaptcha 工具实际上自己提供了一个生成验证码图片的 Servlet,如果我们直接使用它自己提供的验证码 Servlet,那么上面这个配置才会生效,在 Spring Boot 中,如果想要配置 Kaptcha 自己提供的 Servlet,方式如下:

@Bean
ServletRegistrationBean<HttpServlet> kaptchaServlet() {
    ServletRegistrationBean<HttpServlet> bean = new ServletRegistrationBean<>();
    bean.setServlet(new KaptchaServlet());
    bean.addUrlMappings("/img");
    Properties properties = new Properties();
    // 是否有边框 默认为true 我们可以自己设置yes,no
    properties.setProperty(KAPTCHA_BORDER, "yes");
    // 验证码文本字符颜色 默认为Color.BLACK
    properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black");
    // 验证码图片宽度 默认为200
    properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160");
    // 验证码图片高度 默认为50
    properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");
    // 验证码文本字符大小 默认为40
    properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38");
    // KAPTCHA_SESSION_KEY
    properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode");
    // 验证码文本字符长度 默认为5
    properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4");
    // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)
    properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier");
    // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy
    properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy");
    Map<String, String> map = new HashMap<String,String>((Map)properties);
    bean.setInitParameters(map);
    return bean;
}

项目启动后,直接访问 /img 就能看到验证码图片,此时验证码的文本也会自动存入到 session 中。当用户登录的时候,通过 session.getAttribute("kaptchaCode") 就可以获取到验证码的文本内容。

然而很多时候,验证码接口返回的内容都是比较丰富的,可能不仅仅是图片,还有其他信息。所以我们直接配一个 Servlet 并不能满足我们的要求,只能自己写验证码的接口,自己写的话,就要自己把验证码图片存到 session 中去,那么 properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode"); 配置其实就没用了,可以不用加。

2. 自定义验证码文本

当然,我们也可以自定义验证码文本,只需要提供一个验证码文本的实现类即可,如下:

public class KaptchaTextCreator extends DefaultTextCreator {
    private static final String[] CNUMBERS = "0,1,2,3,4,5,6,7,8,9,10".split(",");

    @Override
    public String getText() {
        Integer result = 0;
        Random random = new Random();
        int x = random.nextInt(10);
        int y = random.nextInt(10);
        StringBuilder suChinese = new StringBuilder();
        int randomoperands = (int) Math.round(Math.random() * 2);
        if (randomoperands == 0) {
            result = x * y;
            suChinese.append(CNUMBERS[x]);
            suChinese.append("*");
            suChinese.append(CNUMBERS[y]);
        } else if (randomoperands == 1) {
            if (!(x == 0) && y % x == 0) {
                result = y / x;
                suChinese.append(CNUMBERS[y]);
                suChinese.append("/");
                suChinese.append(CNUMBERS[x]);
            } else {
                result = x + y;
                suChinese.append(CNUMBERS[x]);
                suChinese.append("+");
                suChinese.append(CNUMBERS[y]);
            }
        } else if (randomoperands == 2) {
            if (x >= y) {
                result = x - y;
                suChinese.append(CNUMBERS[x]);
                suChinese.append("-");
                suChinese.append(CNUMBERS[y]);
            } else {
                result = y - x;
                suChinese.append(CNUMBERS[y]);
                suChinese.append("-");
                suChinese.append(CNUMBERS[x]);
            }
        } else {
            result = x + y;
            suChinese.append(CNUMBERS[x]);
            suChinese.append("+");
            suChinese.append(CNUMBERS[y]);
        }
        suChinese.append("=?@" + result);
        return suChinese.toString();
    }
}

这段代码并不难理解,生成的验证码文本类似于 1+1=?@2

Der Grund dafür ist, dass das Kaptcha-Tool tatsächlich ein Servlet bereitstellt, das Bestätigungscode-Bilder generiert. Wenn wir das bereitgestellte Bestätigungscode-Servlet direkt verwenden, wird die obige Konfiguration in Spring Boot wirksam, wenn Sie Kaptcha selbst konfigurieren möchten Das bereitgestellte Servlet lautet wie folgt:

properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "org.javaboy.tienchin.framework.config.KaptchaTextCreator");

Nachdem das Projekt gestartet wurde, können Sie das Bild des Bestätigungscodes sehen, indem Sie direkt auf /img zugreifen. Zu diesem Zeitpunkt wird auch der Text des Bestätigungscodes automatisch gespeichert in der Sitzung. Wenn sich der Benutzer anmeldet, kann der Textinhalt des Bestätigungscodes über session.getAttribute("kaptchaCode") abgerufen werden.

Allerdings ist der von der Bestätigungscode-Schnittstelle zurückgegebene Inhalt oft relativ umfangreich und kann nicht nur aus Bildern, sondern auch aus anderen Informationen bestehen. Daher kann die direkte Konfiguration eines Servlets unsere Anforderungen nicht erfüllen. Wenn wir es selbst schreiben, müssen wir das Bestätigungscode-Bild selbst in der Sitzung speichern, dann properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, " kaptchaCode"); Die Konfiguration ist eigentlich nutzlos und Sie müssen sie nicht hinzufügen.

2. Passen Sie den Text des Bestätigungscodes an🎜🎜Natürlich können wir auch den Text des Bestätigungscodes anpassen. Wir müssen nur eine Implementierungsklasse des Bestätigungscodetextes bereitstellen, wie folgt: 🎜rrreee🎜Dieser Code ist nicht schwer zu verstehen . Der generierte Text des Bestätigungscodes ähnelt einer Zeichenfolge wie 1+1=?@2. 🎜🎜In Zukunft werden wir @ als Trennlinie verwenden, den Zeichenfolgeninhalt vor @ auf dem Bild zeichnen, den Inhalt nach @ in der Sitzung speichern und ihn mit dem vom Benutzer hochgeladenen Inhalt vergleichen. 🎜🎜Natürlich müssen wir bei der Konfiguration des Bestätigungscodes auch die folgenden Attribute hinzufügen, um die Bereitstellungsklasse des Bestätigungscode-Textes zu ändern: 🎜rrreee🎜Nachdem die Konfiguration abgeschlossen ist, können Sie diesen Bestätigungscode direkt in der Schnittstelle im verwenden Achten Sie bei der Verwendung darauf, dass der generierte Bestätigungscode-Text aufgeteilt und verarbeitet wird, ein Teil davon zum Zeichnen und ein Teil davon zum Speichern in der Sitzung verwendet wird. 🎜

Das obige ist der detaillierte Inhalt vonSo implementieren Sie Verifizierungscode mit SpringBoot+kaptcha. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen