SpringMVC 加入 Kaptcha 实现图片验证码

加入依赖
<!-- Kaptcha 验证码插件 -->
<dependency>
    <groupId>com.github.penggle</groupId>
    <artifactId>kaptcha</artifactId>
    <version>2.3.2</version>
</dependency>
在 spring-mvc.xml 中加入
    <!-- Kaptcha 图片验证码 -->
    <bean id="chptchaProducer" class="com.google.code.kaptcha.impl.DefaultKaptcha"> 
        <property name="config" >
            <bean class="com.google.code.kaptcha.util.Config">
                <constructor-arg>
                    <props>
                        <prop key="kaptcha.border">yes</prop>
                        <prop key="kaptcha.border.color">105,179,90</prop>
                        <prop key="kaptcha.textproducer.font.color">blue</prop>
                        <prop key="kaptcha.image.width">125</prop>
                        <prop key="kaptcha.image.height">45</prop>
                        <prop key="kaptcha.textproducer.font.size">45</prop>
                        <prop key="kaptcha.session.key">code</prop>
                        <!-- 
                        <prop key="kaptcha.textproducer.char.string">abcdfkgujtmei123456789</prop>
                         -->
                        <prop key="kaptcha.textproducer.char.length">4</prop>
                        <prop key="kaptcha.textproducer.font.names">宋体,楷体,微软雅黑</prop>
                    </props>
                </constructor-arg>
            </bean>     
        </property>
    </bean>

属性具体配置:http://www.jianshu.com/p/e6c71bc37759


文本实现类:kaptcha.textproducer.impl 值为:com.google.code.kaptcha.text.impl.DefaultTextCreator

验证码值配置:kaptcha.textproducer.char.string 值:abcde2345678gfynmnpwx(随意你自己写)

验证码的长度:kaptcha.textproducer.char.length 值:

字体:kaptcha.textproducer.font.names 值:Arial,Courier

字体颜色:kaptcha.textproducer.font.color 值: r,g,b 或者 white,black,blue

文字间隔:kaptcha.textproducer.char.space 值:

干扰实现类:kaptcha.noise.impl 值:com.google.code.kaptcha.impl.DefaultNoise/NoNoise

干扰颜色:kaptcha.noise.color 值: r,g,b 或者 white,black,blue

图片样式:kaptcha.obscurificator.impl 值:

水纹com.google.code.kaptcha.impl.WaterRipple

鱼眼com.google.code.kaptcha.impl.FishEyeGimpy

阴影com.google.code.kaptcha.impl.ShadowGimpy

背景实现类:kaptcha.background.impl 值:com.google.code.kaptcha.impl.DefaultBackground

背景渐变色开始:kaptcha.background.clear.from 值:r,g,b 或者 white,black,blue

背景渐变色结束:kaptcha.background.clear.to 值:r,g,b 或者 white,black,blue

文字渲染器:kaptcha.word.impl 值:com.google.code.kaptcha.text.impl.DefaultWordRenderer

session中存放验证码的key键:kaptcha.session.key 值:KAPTCHA_SESSION_KEY

Contro;;er 中实现
/**
     * 验证码生成
     * @param request
     * @param response
     * @return
     * @throws IOException
     */
    @RequestMapping(value="/captcha-image")
    public ModelAndView getKaptchaImage(HttpServletRequest request, HttpServletResponse response) throws IOException {
        
        System.out.println(request);
        System.out.println(response);
        // 从 session 获取验证码的 code 值
        HttpSession session = request.getSession();
        System.out.println(session);
        String code = (String) session.getAttribute(Constants.KAPTCHA_SESSION_KEY);
        System.out.println(code);
        
        // 设置清除浏览器的缓存
        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/png");
        
        // 设置 session 
        String capText = captchaProducer.createText();
        System.out.println("设置session:" + capText);
        session.setAttribute(Constants.KAPTCHA_SESSION_KEY, capText);
        
        // 输出验证码
        BufferedImage bi = captchaProducer.createImage(capText);
        ServletOutputStream out = response.getOutputStream();
        ImageIO.write(bi, "png", out);
        out.flush();
        out.close();
        
        return null;
    }

    /**
     * 验证码校验
     * @param request
     * @param response
     * @param code_j
     * @return
     * @throws Exception
     */
    @RequestMapping("/codeCheck")
    public String codeCheck(HttpServletRequest request, HttpServletResponse response,
            @RequestParam("code")String code_j) throws Exception {
        
        HttpSession session = request.getSession();
        String code = (String) session.getAttribute(Constants.KAPTCHA_SESSION_KEY);
        JSONObject json = new JSONObject();
        if (code_j.equals(code)) {
            json.put("ok", true);
        } else {
            json.put("ok", false);
        }
        ResponseUtil.write(response, json);
        return null;
    }
JSP 页面
<tr>
    <td>验证码:</td>
    <td><input id="j_code" type="text" name="j_code" onblur="javascript:codeCheck()"></td>
    ![](${path }/test/captcha-image)
    <a href="javascript:chageCode()">看不清?换一张</a>
</tr>

    <script type="text/javascript">
        
        // 刷新验证码
        function chageCode() {
            var time = new Date().getTime();
            $("#kaptchaImage").attr('src', '${path }/test/captcha-image?id='+time);
        }

              // Ajax 验证验证码
        function codeCheck() {
            var code = $('#inputImagecode').val();
            $.post(
                '${path}/codeCheck',
                {
                    'code' : code
                },
                function(result) {
                    if(result.ok) {
                        //alert("验证码正确!");
                        $('#inputImagecode').css('background-color', 'rgba(91, 255, 173, 0.2)')
                        $('#submitbtn').addAttr('onsubmit');
                    } else {
                        //alert("验证码错误!");
                        $('#inputImagecode').css('background-color', 'rgba(255, 81, 81, 0.2)')
                        $('#submitbtn').removeAttr('onsubmit');
                    }
                }, 'json');
        }

    </script>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 验证码定义:验证码是一种区分用户是计算机还是人的公共自动程序。作用:可以防止恶意破解密码,刷票、论坛灌水,有效防止...
    年少懵懂丶流年梦阅读 4,155评论 0 1
  • 几次闲谈发现,即使世界复杂多变、困难重重,仍然有人如鱼得水、游刃有余,取得令人艳羡的成就。这些人都是“有心人”:时...
    阳光玉豆阅读 3,405评论 0 2
  • 在家乡的夏末,我拖着硕大笨拙的行李箱来到北方,落地便已入秋。 适应新生活,心总也飘忽不定。北方出了名的干燥让我...
    大脸象阅读 3,535评论 11 1
  • 在互联网潮流下,一个新的用户需求就会拉动软件系统的更新换代和变革,不更新换代的软件在群控市场是没有竞争力的。兔客服...
    xiaoyi166阅读 1,690评论 0 0
  • 司徒来到距离前厅最远的后花园,才敢开口问话,因为他知道巫月的听力非同一般。 侍从悄声回复,刚才在去穹宫送饭的路...
    夷夏传说阅读 2,256评论 0 2