Home >Java >javaTutorial >How to implement verification code with SpringBoot+kaptcha
kaptcha is a very old verification code generation tool. How old is it? Dating back to 2006.
After so many years, not only is it not lonely but it is still being used by many people, which shows its vitality and is worthy of our study.
For convenience, we will create a Spring Boot project to demonstrate its usage.
First create a new Spring Boot project, and then add kaptcha dependencies, as follows:
<dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version> </dependency>
Next we only need to provide a Bean to configure Kaptcha, as follows:
@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; } }## Configure each attribute value of the verification code image in #DefaultKaptcha. The meaning of each attribute is commented in the code, so I won’t say more. Next we return the verification code image in the interface, as follows:
@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()); }Here I write the image to the front end in the form of IO stream, of course it can also be converted into a Base64 The string returned to the front end is also OK. Wait, something seems to be missing! We did not store the generated verification code text into the session, so it would not be possible to verify when logging in. Some friends may say, isn’t this simple? Isn’t it enough to just save it in the interface? NONONO! Look, when we configure the DefaultKaptcha bean, there is such a line of code
properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode");, this line of code means that it will automatically The generated verification code text is stored in the session, and the KEY of the session is kaptchaCode. However, in actual testing, you will find that the above code does not store the text generated by the verification code into the session.
@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; }After the project is started, directly access
/img to see the verification code image, and the text of the verification code will also be automatically saved. Enter the session. When the user logs in, the text content of the verification code can be obtained through
session.getAttribute("kaptchaCode").
properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, " kaptchaCode"); The configuration is actually useless and you don’t need to add it.
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(); } }This code is not difficult to understand. The generated verification code text is similar to a string like
1 1=?@2.
properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "org.javaboy.tienchin.framework.config.KaptchaTextCreator");After the configuration is completed, this verification code will be used directly in the interface in the future That's it. When using it, pay attention to splitting the generated verification code text and processing it. Part of it is used for drawing and part of it is used to save it in the session.
The above is the detailed content of How to implement verification code with SpringBoot+kaptcha. For more information, please follow other related articles on the PHP Chinese website!