zoukankan      html  css  js  c++  java
  • kaptcha谷歌验证码工具的使用

    基于前后端分离或者非前后端分离都可以使用的java验证码实现方法

    第一步:引入依赖

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

    第二步:增加验证码生成的配置类,颜色,字体,干扰线等配置都在这里修改
    参数参考地址:https://www.cnblogs.com/louis80/p/5230507.html

    package com.zp.springbootdemo.util;
    
    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;
    
    /**
     * @Author zp
     * @Description 验证码生成的配置类
     * @Date 21:24 2020/5/7
     * @Param 
     * @return 
     **/
    @Configuration
    public class KaptchaConfig {
        @Bean
        public DefaultKaptcha producer(){
            DefaultKaptcha defaultKaptcha=new DefaultKaptcha();
            Properties properties=new Properties();
            properties.setProperty("kaptcha.border", "no");
            properties.setProperty("kaptcha.border.color", "white");
            properties.setProperty("kaptcha.textproducer.font.color", "255,192,55");
            properties.setProperty("kaptcha.image.width", "125");
            properties.setProperty("kaptcha.image.height", "45");
            properties.setProperty("kaptcha.session.key", "code");
            properties.setProperty("kaptcha.textproducer.font.size", "38");
            properties.setProperty("kaptcha.noise.color","21,113,171");
            properties.setProperty("kaptcha.background.clear.from","0,154,255");
            properties.setProperty("kaptcha.background.clear.to","0,202,255");
            properties.setProperty("kaptcha.textproducer.char.length", "4");
            properties.setProperty("kaptcha.textproducer.font.names", "Arial");
            Config config=new Config(properties);
            defaultKaptcha.setConfig(config);
            return defaultKaptcha;
        }
    }

    第三步:验证码的生成

    通过DefaultKaptcha 类的createText()方法可生成文字验证码,文字验证码生成之后再生成图片验证码。返回给前端时可返回base64编码的图片验证码字符串,前端进行处理。也可直接返回图片。

    1.方式一,获取图片验证码,返回一个base64编码的图片字符串

        @Autowired
        private DefaultKaptcha producer;
    
    
        /**
         * @Author zp
         * @Description //获取图片验证码,返回一个base64编码的图片字符串
         * @Date 22:48 2020/5/7
         * @Param []
         * @return java.lang.String
         **/
        @GetMapping(value = "/default")
        public String generateVerificationCode() throws Exception {
            // 生成文字验证码,为了进行校验,可将文字验证码存入redis中
            String text = producer.createText();
            // 生成图片验证码
            ByteArrayOutputStream outputStream = null;
            BufferedImage image = producer.createImage(text);
            outputStream = new ByteArrayOutputStream();
            ImageIO.write(image, "jpg", outputStream);
    
            BASE64Encoder encoder = new BASE64Encoder();
            String imageStr=encoder.encode(outputStream.toByteArray());
            //利用在线工具测试返回的base64编码的图片验证码字符串是否可以解析http://www.vgot.net/test/image2base64.php
            return imageStr;
        }

    2.方式二 ,获取图片验证码,图片验证码直接渲染到页面上

        /**
         * @Author zp
         * @Description //获取图片验证码,图片验证码直接渲染到页面上
         * @Date 23:30 2020/5/7
         * @Param [httpServletRequest, httpServletResponse]
         * @return void
         **/
        @GetMapping("/getCode")
        public void defaultKaptcha(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception{
            byte[] captchaChallengeAsJpeg = null;
            ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
            try {
                //生成文字验证码,为了进行校验,可将文字验证码存入redis中
                String createText = producer.createText();
    
                //使用生产的验证码字符串返回一个BufferedImage对象并转为byte写入到byte数组中
                BufferedImage challenge = producer.createImage(createText);
                ImageIO.write(challenge, "jpg", jpegOutputStream);
            } catch (IllegalArgumentException e) {
                httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND);
                return;
            }
            //定义response输出类型为image/jpeg类型,使用response输出流输出图片的byte数组
            captchaChallengeAsJpeg = jpegOutputStream.toByteArray();
            httpServletResponse.setHeader("Cache-Control", "no-store");
            httpServletResponse.setHeader("Pragma", "no-cache");
            httpServletResponse.setDateHeader("Expires", 0);
            httpServletResponse.setContentType("image/jpeg");
            ServletOutputStream responseOutputStream =
                    httpServletResponse.getOutputStream();
            responseOutputStream.write(captchaChallengeAsJpeg);
            responseOutputStream.flush();
            responseOutputStream.close();
        }

    第四步:验证码的校验

    验证码的校验时,前端需要将生成的验证码传到后端,后端进行比较。在生成验证码时,可将生成的文字验证码存入redis或session中,进行比较时需要从redis或session中获取,然后进行比较。代码省略。。。

  • 相关阅读:
    POJ 1113 Wall
    POJ 2159 Ancient Cipher
    POJ 3253 Fence Repair
    HDU 5444 Elven Postman
    HDU 5432 Pyramid Split
    数据库 组合查询
    数据库 简单的数据查询
    数据库 聚合函数与分组
    数据库 使用DML语句更改数据
    数据库的数据完整性
  • 原文地址:https://www.cnblogs.com/zhangpeng8888/p/12846682.html
Copyright © 2011-2022 走看看