zoukankan      html  css  js  c++  java
  • JAVA整合kaptcha生成验证码

    引入maven

    <!--图片验证码-->
            <dependency>
                <groupId>com.github.penggle</groupId>
                <artifactId>kaptcha</artifactId>
                <version>2.3.2</version>
                <exclusions>
                    <exclusion>
                        <artifactId>javax.servlet-api</artifactId>
                        <groupId>javax.servlet</groupId>
                    </exclusion>
                </exclusions>
            </dependency>

    验证码配置类

    KaptchaConfig.java

    package com.test.cms.kaptcha;
    
    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;
    
    /**
     * 验证码配置
     */
    @Configuration
    public class KaptchaConfig {
    
    
        
        @Bean(name = "captchaProducer")
        public DefaultKaptcha getKaptchaBean() {
            Properties properties = new Properties();
            //图片边框
            properties.setProperty("kaptcha.border", "no");
            //文本集合,验证码值从此集合中获取
            properties.setProperty("kaptcha.textproducer.char.string", "ABCDEGHJKLMNRSTUWXY23456789");
            //字体颜色
            properties.setProperty("kaptcha.textproducer.font.color", "0,84,144");
            //干扰颜色
            properties.setProperty("kaptcha.noise.color", "0,84,144");
            //字体大小
            properties.setProperty("kaptcha.textproducer.font.size", "30");
            //背景颜色渐变,开始颜色
            properties.setProperty("kaptcha.background.clear.from", "247,255,234");
            //背景颜色渐变,结束颜色
            properties.setProperty("kaptcha.background.clear.to", "247,255,234");
            //图片宽
            properties.setProperty("kaptcha.image.width", "125");
            //图片高
            properties.setProperty("kaptcha.image.height", "35");
            properties.setProperty("kaptcha.session.key", "code");
            //验证码长度
            properties.setProperty("kaptcha.textproducer.char.length", "4");
            //字体
            properties.setProperty("kaptcha.textproducer.font.names", "Arial, Courier");
            Config config = new Config(properties);
            DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
            defaultKaptcha.setConfig(config);
            return defaultKaptcha;
        }
    }

    控制器类

    KaptchaController.java    

    package com.test.cms.kaptcha;
    
    import com.google.code.kaptcha.Producer;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    import sun.misc.BASE64Encoder;
    
    import javax.imageio.ImageIO;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.awt.image.BufferedImage;
    import java.io.ByteArrayOutputStream;
    import java.util.HashMap;
    import java.util.Map;
    
    @RestController
    public class KaptchaController {
    
        /**
         * 加载图形验证码
         */
        @GetMapping("/kaptcha")
        public String getKaptchaImage(HttpServletRequest request, HttpServletResponse response) throws Exception {
            response.setDateHeader("Expires", 0);
            // 设置浏览器渲染不做本地缓存
            response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
            // Set IE extended HTTP/1.1 no-cache headers (use addHeader).
            response.addHeader("Cache-Control", "post-check=0, pre-check=0");
            response.setHeader("Content-Security-Policy", "none");
            // 设置浏览器渲染不读取浏览器缓存
            response.setHeader("Pragma", "no-cache");
    
            String originHeader = request.getHeader("Origin");
            // 这个限定来自自身服务端域名
            /*if (originHeader != null && (originHeader.contains(request.getServerName()))) {
                response.setHeader("Access-Control-Allow-Origin", originHeader);
            } else {
                response.setHeader("Access-Control-Allow-Origin", request.getServerName());
            }*/
            // 设置浏览器渲染图片类型
            response.setContentType("image/jpeg");
            // 生成验证码内容
            String capText = captchaProducer.createText();
    
            String sessionId = request.getSession().getId();
    
            System.out.println(sessionId + "," + capText);
    
            /**
             *这里将sessionId作为key存入redis中,用于后面的验证码验证,可以设置失效时间
             * springboot整合redis可以参考 https://www.cnblogs.com/pxblog/p/12980634.html
             */
            //redisService.set(Constants.KAPTCHA_SESSION_KEY+sessionId, capText);
    
            //生成图片
            BufferedImage bi = captchaProducer.createImage(capText);
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            ImageIO.write(bi, "jpg", outputStream);
    
            Map<String, Object> map = new HashMap<String, Object>(2);
    
            //转为base64
            String img=imageToBase64ByByte(outputStream.toByteArray());
    
            map.put("img", img);
            //sessionId 主要用于验证验证码使用
            map.put("sessionId", sessionId);
    
            try {
                outputStream.flush();
            }finally {
                outputStream.close();
            }
            //这里将map返回到前台,此处简单demo
            return img+","+sessionId;
        }
    
    
        public static String imageToBase64ByByte(byte[] data) {
            BASE64Encoder encoder = new BASE64Encoder();
            return encoder.encode(data);
        }
    
    
        /**
         * 验证验证码是否正确
         * @param code  前台填写的验证码
         * @param sessionId  生成验证码时返回的sessionId
         * @return
         */
        @GetMapping("/valid")
        public Boolean valid(String code,String sessionId) {
    
            String verifyCode ="这里从redis中取出原本的验证码进行判断:redisService.get(Constants.KAPTCHA_SESSION_KEY+sessionId)";
            System.out.println(verifyCode);
            return verifyCode.equalsIgnoreCase(code);
        }
    
    
        @Autowired
        private Producer captchaProducer;
    
    
    }

    页面调用

    <div class="letter pointer" id="getCapatchImg"><img id="capatchImg"  onclick="genCapatch()" /></div>
    // 图形验证码

    var sessionId=""; $(function () { $("#getCapatchImg").on("click", function (event) { genCapatch(); }); }); function genCapatch() { $.ajax({ url: "/kaptcha", data: {}, success: function (result) { document.getElementById('capatchImg').src = "data:image/png;base64," + result.data.img; sessionId=result.data.sessionId } }); }
  • 相关阅读:
    如何挖掘需求,覆盖整个系统
    JVM全整理
    7.linux文件与目录管理
    6.linux的文件权限与目录配置
    获取外汇基本汇率
    Pointer-Events: 如何处理ScreenTouch和MouseClicks
    Excel如何快速定位出两列的不同值
    Java数据结构: java.util.BitSet源码学习
    一道面试题与Java位操作 和 BitSet 库的使用
    Test post.
  • 原文地址:https://www.cnblogs.com/pxblog/p/13404402.html
Copyright © 2011-2022 走看看