java 使用kaptcha插件来生成图形验证码

使用kaptcha插件生成图形验证码

最近在做维护一个项目时,客户提出以前的验证码过于简单,需要换一个相对复杂一点的验证码,所以这次就使用了kaptcha这个工具来生成图形验证码

首先,下载jar包

如果是maven项目,直接使用maven下载,

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

如果不是maven管理的,直接下载jar包,放到lib下面即可
下面附上jar包地址:
https://pan.baidu.com/s/1VkptoNTw3yTy53JPnuTziQ

配置spring bean

因为我用的springmvc架构,所以直接在application.xml中进行配置,

    <bean id="captchaProducer" class="com.google.code.kaptcha.impl.DefaultKaptcha">
        <property name="config">
            <bean class="com.google.code.kaptcha.util.Config">
                <constructor-arg type="java.util.Properties">
                     <props>
                        <prop key="kaptcha.border">yes</prop>
                        <prop key="kaptcha.border.color">228,228,228</prop>
                        <prop key="kaptcha.border.thickness">1</prop>
                        <prop key="kaptcha.image.width">260</prop>
                        <prop key="kaptcha.image.height">50</prop>
                        <prop key="kaptcha.producer.impl">com.google.code.kaptcha.impl.DefaultKaptcha</prop>
                        <prop key="kaptcha.textproducer.impl">com.google.code.kaptcha.text.impl.DefaultTextCreator</prop>
                        <prop key="kaptcha.textproducer.char.string">abcdefhjkmnopqrstuvwxyz2345678</prop>
                        <prop key="kaptcha.textproducer.char.length">5</prop>
                        <prop key="kaptcha.textproducer.font.names">宋体,楷体,微软雅黑</prop>
                        <prop key="kaptcha.textproducer.font.size">40</prop>
                        <prop key="kaptcha.textproducer.char.space">5</prop>
                        <prop key="kaptcha.session.key">KAPTCHA_SESSION_KEY</prop>
                        <prop key="kaptcha.session.date">KAPTCHA_SESSION_DATE</prop>
                    </props> 
                </constructor-arg>
            </bean>
        </property>
    </bean>

这是配置了一个captchaProducer,主要靠这个bean来生成验证码

创建一个工具类 KaptchaUtils.java

package com.hzseek.util;

import java.awt.image.BufferedImage;
import javax.servlet.http.HttpSession;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.code.kaptcha.Producer;

public class KaptchaUtils {

    private static Producer captchaProducer;

    private static Logger logger = LoggerFactory.getLogger(KaptchaUtils.class);

    public void setCaptchaProducer(Producer captchaProducer) {
        KaptchaUtils.captchaProducer = captchaProducer;
    }

    public static BufferedImage getKapthaImage(HttpSession session) {
        String capText = captchaProducer.createText();
        logger.info("getKapthaImage :" + capText);
        session.setAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY, capText);

        return captchaProducer.createImage(capText);
    }

    public static boolean validCode(HttpSession session, String code) {
        if(StringUtils.isEmpty(code))
            return false;
        else
            return code.equals(session.getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY));
    }
}

controller层中进行调用

因为我用的struts2,所以是直接在execute方法中输出图片流。

package com.hzseek.web.action;

import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import org.springside.modules.web.struts2.Struts2Utils;
import com.hzseek.util.KaptchaUtils;
import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class KaptchaAction extends ActionSupport{

    @Override
    public String execute() throws Exception {
        HttpServletResponse response = Struts2Utils.getResponse();

        response.setHeader("Cache-Control", "no-store");
        response.setHeader("Pragma", "no-cache");
        response.setDateHeader("Expires", 0);
        response.setContentType("image/jpeg");

        //利用生成的字符串构建图片
        BufferedImage image = KaptchaUtils.getKapthaImage(Struts2Utils.getSession());
        ServletOutputStream out = response.getOutputStream();
        ImageIO.write(image, "jpeg", out); 
        try {
            out.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally{
            out.close();
        }
        return null;
    }
}

前端代码

直接通过url调用

<img id="validCodeImage" src="${request.contextPath}/kaptcha.action"/><a href="javascript:changeValidCode('#validCodeImage');" tabindex="5">看不清,换一张</a>

如果想要点击切换,可以增加js方法

function changeValidCode(obj) {
    $(obj).attr('src','${request.contextPath}/kaptcha.action?id=' + Math.random());
}

效果

这里写图片描述

以下为kaptcha图形验证码可配置项

Constant 描述 默认值
kaptcha.border 图片边框,合法值:yes , no yes
kaptcha.border.color 边框颜色,合法值: r,g,b (and optional alpha) 或者 white,black,blue. black
kaptcha.border.thickness 边框厚度,合法值:>0 1
kaptcha.image.width 图片宽 200
kaptcha.image.height 图片高 50
kaptcha.producer.impl 图片实现类 com.google.code.kaptcha.impl.DefaultKaptcha
kaptcha.textproducer.impl 文本实现类 com.google.code.kaptcha.text.impl.DefaultTextCreator
kaptcha.textproducer.char.string 文本集合,验证码值从此集合中获取 abcde2345678gfynmnpwx
kaptcha.textproducer.char.length 验证码长度 5
kaptcha.textproducer.font.names 字体 Arial, Courier
kaptcha.textproducer.font.size 字体大小 40px.
kaptcha.textproducer.font.color 字体颜色,合法值: r,g,b 或者 white,black,blue. black
kaptcha.textproducer.char.space 文字间隔 2
kaptcha.noise.impl 干扰实现类 com.google.code.kaptcha.impl.DefaultNoise
kaptcha.noise.color 干扰颜色,合法值: r,g,b 或者 white,black,blue. black
kaptcha.obscurificator.impl 图片样式:水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy com.google.code.kaptcha.impl.WaterRipple
kaptcha.background.impl 背景实现类 com.google.code.kaptcha.impl.DefaultBackground
kaptcha.background.clear.from 背景颜色渐变,开始颜色 light grey
kaptcha.background.clear.to 背景颜色渐变,结束颜色 white
kaptcha.word.impl 文字渲染器 com.google.code.kaptcha.text.impl.DefaultWordRenderer
kaptcha.session.key session key KAPTCHA_SESSION_KEY
kaptcha.session.date session date KAPTCHA_SESSION_DATE

读者可以根据自己的需要来选择,自己可以实验一下,还是蛮有趣的。

猜你喜欢

转载自blog.csdn.net/u010398838/article/details/79714403