Java使用Kaptcha生成验证码

首先下载好Kaptcha的jar包http://www.everycoding.com/maven2/com/github/penggle/kaptcha.html

下载好后我们放到WEB-INF的lib文件夹下就可以了。

1.第一个验证码

我们首先先来简单的生成一个验证码。

首先写好index.jsp

<script type="text/javascript">
    function reloadCode() {
        var date = new Date().getTime();
        document.getElementById("code").src = "<%=request.getContextPath() %>/imageKaptcha?d="+date;
    }
</script>
<form action="checkCaptcha.jsp" method = "post">
     <img alt="验证码" src="imageKaptcha" id = "code"><a href = "javascript:reloadCode();">看不清</a>
     <input type = "text" name = "captcha">
     <input type = "submit" value = "submit">
</form>

接着我们写一个检查验证码输入是否正确的checkCaptcha.jsp

<body>
    <%
        request.setCharacterEncoding("utf-8");
        // 获取Kaptcha jar包里面的KAPTCHA_SESSION_KEY
        String trueCaptcha = (String)session.getAttribute(Constants.KAPTCHA_SESSION_KEY);
        String inputCaptcha = request.getParameter("captcha");
        if(trueCaptcha.toLowerCase().equals(inputCaptcha.toLowerCase())) {
            out.println("输入正确");
        } else {
            out.println("输入错误");
        }
    %>
</body>

写完就这两个,然后配置好web.xml就ok了。挺方便的。下面我们看看怎么配置web.xml

<servlet>
    <servlet-name>myCaptcha</servlet-name>
    <!-- jar中的 KaptchaServlet的路径-->
    <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>myCaptcha</servlet-name>
    <!-- 对于index.jsp中img的src -->
    <url-pattern>/imageKaptcha</url-pattern>
</servlet-mapping>

做完上述步骤之后,我们启动tomcat之后,打开网页,就可以看到效果图了。
这里写图片描述

其实Kaptcha有很多配置可以供我们选择,下面我们就来讲一讲怎么在web.xml中怎么进行配置。


2.Kaptcha的详细配置参数

这个表画的不好(因为我的编辑器的问题),大家可以看看这篇http://www.codeliu.com/javaweb/329.html
上面就是完整的Kaptcha配置表,下面我们来看看在web.xml中怎么进行配置。

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

配置我就不一一试了。每改一次就得重新启动tomcat。累,大家感兴趣的可以自己试试,,反正基本能满足我们的要求了。


3.实现中文验证码

其实利用Kaptcha也可以实现中文验证码,jar包里面有个自带的类ChineseTextProducer,我们在web.xml中修改kaptcha.textproducer.impl参数就可以。
这里写图片描述

扫描二维码关注公众号,回复: 354343 查看本文章

ChineseTextProducer源码如下

public class ChineseTextProducer implements TextProducer
{
    private String[] simplifiedChineseTexts = new String[]{
         "包括焦点", "新道消点", "服分目搜", "索姓名電", "子郵件信", "主旨請回", "電子郵件", "給我所有", "討論區明", "發表新文", "章此討論", "區所有文", "章回主題",
         "樹瀏覽搜"
    };

    /**
     * @return random Chinese text
     */
     public String getText()
     {
         return simplifiedChineseTexts[new Random().nextInt(simplifiedChineseTexts.length)];
     }
}

可以看到里面的中文字没几个,我试了一下,用这个类生成的验证码还都是乱码。所以建议我们自己实现一个类,要自己实现一个也很简单只要像它一样实现TextProducer接口就可以了。

public class ChineseTextProducer extends Configurable implements TextProducer{
    private String[] simplifiedChineseTexts = {"这多","未必能解","就是这样","你狠牛逼"};
    public String getText() {
        return simplifiedChineseTexts[new Random().nextInt(simplifiedChineseTexts.length)];
    }
}

就是这么简单,要什么文字就往数组中加,重写getText方法就可以了,不过这里有个坑,那就是要中文验证码一定要修改web.xml配置里的kaptcha.textproducer.font.names参数,它的默认值是Arial, Courier,这个是不支持中文的,所以我们要改成支持中文的字体,比如微软雅黑。切记切记。其他的就是得修改一下kaptcha.textproducer.impl参数,因为它是指文本实现类,我们把它的值改成我们自己写的那个类就可以,然后启动tomcat,打开网页。
这里写图片描述



玩法大概就是这么多了,可以去看看jar包的源码。

个人博客 http://www.codeliu.com

猜你喜欢

转载自blog.csdn.net/a_helloword/article/details/80056523