资讯详情

springboot+kaptcha生成数学运算验证码和字符验证码

只需复制粘贴以下代码,修改文本生成器路径即可,文中有解释。

  1. 添加kaptcha依赖

    <dependency>     <groupId>com.github.penggle</groupId>     <artifactId>kaptcha</artifactId>     <version>2.3.2</version> </dependency> 
  2. 编写验证码文本生成器,用于数据操作验证码

    创建KaptchaTextCreator验证码文本生成器类

    package com.liu.springsecurity.config; import com.google.code.kaptcha.text.impl.DefaultTextCreator;  import java.security.SecureRandom; import java.util.Random;  /** * 验证码文本生成器 * * @author shw */ public class KaptchaTextCreator extends DefaultTextCreator { 
                  private static final String[] CNUMBERS = "1、2、3、4、6、7、9".split(",");      @Override     public String getText(){ 
                      Integer result = 0;         Random random = new SecureRandom();         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();
        }
    }
    
  3. 编写配置文件

    创建kaptcha配置文件类CaptchaConfig

    package com.liu.springsecurity.config;
    import com.google.code.kaptcha.impl.DefaultKaptcha;
    import com.google.code.kaptcha.util.Config;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import java.util.Properties;
    
    import static com.google.code.kaptcha.Constants.*;
    
    @Configuration
    public class CaptchaConfig{ 
             
        @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;
        }
    
        @Bean(name = "captchaProducerMath")
        public DefaultKaptcha getKaptchaBeanMath(){ 
             
            DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
            Properties properties = new Properties();
            // 是否有边框 默认为true 我们可以自己设置yes,no
            properties.setProperty(KAPTCHA_BORDER, "yes");
            // 边框颜色 默认为Color.BLACK
            properties.setProperty(KAPTCHA_BORDER_COLOR, "105,179,90");
            // 验证码文本字符颜色 默认为Color.BLACK
            properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "blue");
            // 验证码图片宽度 默认为200
            properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160");
            // 验证码图片高度 默认为50
            properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");
            // 验证码文本字符大小 默认为40
            properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "35");
            // KAPTCHA_SESSION_KEY
            properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCodeMath");
            // 验证码文本生成器,这里要修改成自己KaptchaTextCreator类
            properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.liu.springsecurity.config.KaptchaTextCreator");
            // 验证码文本字符间距 默认为2
            properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "3");
            // 验证码文本字符长度 默认为5
            properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "6");
            // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)
            properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier");
            // 验证码噪点颜色 默认为Color.BLACK
            properties.setProperty(KAPTCHA_NOISE_COLOR, "white");
            // 干扰实现类
            properties.setProperty(KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise");
            // 图片样式 水纹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;
        }
    }
    

    要改的地方com.liu.kaptcha.config.KaptchaTextCreator改成自己第2步创建的地址

    // 验证码文本生成器
    properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.liu.kaptcha.config.KaptchaTextCreator");
    
  4. 编写controller层

    package com.liu.kaptcha.controller;
    
    import com.google.code.kaptcha.Constants;
    import com.google.code.kaptcha.Producer;
    import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
    import org.springframework.util.FastByteArrayOutputStream;
    import org.springframework.web.bind.annotation.CrossOrigin;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.annotation.Resource;
    import javax.imageio.ImageIO;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    
    @RestController
    @RequestMapping("/captcha")
    @CrossOrigin
    public class kaptcha { 
             
        @Resource(name = "captchaProducer")
        private Producer captchaProducer;
    
        @Resource(name = "captchaProducerMath")
        private Producer captchaProducerMath;
    
        /** * @Title: KaptcheController * @Description: 返回jpg图片 * @Author: liu * @Date: 2022/1/17 13:48 * @Parameters: * @Return */
        @GetMapping(value = "/captchaImage")
        public ModelAndView getKaptchaImage(HttpServletRequest request, HttpServletResponse response)
        { 
             
            ServletOutputStream out = null;
            try
            { 
             
                HttpSession session = request.getSession();
                response.setDateHeader("Expires", 0);
                response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
                response.addHeader("Cache-Control", "post-check=0, pre-check=0");
                response.setHeader("Pragma", "no-cache");
                response.setContentType("image/jpeg");
    
                String type = request.getParameter("type");
                String capStr = null;
                String code = null;
                BufferedImage bi = null;
                if ("math".equals(type))
                { 
             
                    String capText = captchaProducerMath.createText();
                    capStr = capText.substring(0, capText.lastIndexOf("@"));
                    code = capText.substring(capText.lastIndexOf("@") + 1);
                    bi = captchaProducerMath.createImage(capStr);
                }
                else if ("char".equals(type))
                { 
             
                    capStr = code = captchaProducer.createText();
                    bi = captchaProducer.createImage(capStr);
                }
                session.setAttribute(Constants.KAPTCHA_SESSION_KEY, code);
                System.out.println(code);
    
                out = response.getOutputStream();
                ImageIO.write(bi, "jpg", out);
                out.flush();
            }
            catch (Exception e)
            { 
             
                e.printStackTrace();
            }
            finally
            { 
             
                try
                { 
             
                    if (out != null)
                    { 
             
                        out.close();
                    }
                }
                catch (IOException e)
                { 
             
                    e.printStackTrace();
                }
            }
            return null;
        }
        /** * @Title: KaptcheController * @Description: 返回base64字符串 * @Author: liu * @Date: 2022/1/17 13:48 * @Parameters: * @Return */
        @RequestMapping("/captchaBase64")
        public String  getCapt(HttpServletRequest request, HttpServletResponse response){ 
             
            HttpSession session = request.getSession();
            String capStr = null, code = null;
            BufferedImage image = null;
            String captchaType = request.getParameter("type");
    
            // 生成验证码
            if ("math".equals(captchaType)){ 
             
                String capText = captchaProducerMath.createText();
                capStr = capText.substring(0, capText.lastIndexOf("@"));
                code = capText.substring(capText.lastIndexOf("@") + 1);
                image = captchaProducerMath.createImage(capStr);
            }else if ("char".equals(captchaType)){ 
             
                capStr = code = captchaProducer.createText();
                image = captchaProducer.createImage(capStr);
            }
            session.setAttribute(Constants.KAPTCHA_SESSION_KEY, code);
            System.out.println(code);
            // 转换流信息写出
            FastByteArrayOutputStream os = new FastByteArrayOutputStream();
            try{ 
             
                ImageIO.write(image, "jpg", os);
            }
            catch (IOException e){ 
             
                return (e.getMessage());
            }
            return  "data:image/jpg;base64,"+Base64.encode(os.toByteArray());
        }
    }
    
    
    

标签: shw铝电解电容器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台