SpringMVC项目使用验证码生成工具kaptcha

首先,通过maven下载将kaptcha引入到项目中。

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

 

这个验证码是基于Servlet的,因此我们需要在web.xml中配置一个对应的servlet,同时指定初始化参数,初始化参数决定了验证码的样式和内容。如下:

    <servlet>
        <servlet-name>Kaptcha</servlet-name>
        <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
        <!-- 是否有边框 -->
        <init-param>
            <param-name>kaptcha.border</param-name>
            <param-value>no</param-value>
        </init-param>
        <!-- 字体颜色 -->
        <init-param>
            <param-name>kaptcha.textproducer.font.color</param-name>
            <param-value>red</param-value>
        </init-param>
        <!-- 图片宽度 -->
        <init-param>
            <param-name>kaptcha.image.width</param-name>
            <param-value>135</param-value>
        </init-param>
        <!-- 使用哪些字符生成验证码 -->
        <init-param>
            <param-name>kaptcha.textproducer.char.string</param-name>
            <param-value>ACDEFHKPRSTWX345679</param-value>
        </init-param>
        <!-- 图片高度 -->
        <init-param>
            <param-name>kaptcha.image.height</param-name>
            <param-value>50</param-value>
        </init-param>
        <!-- 字体大小 -->
        <init-param>
            <param-name>kaptcha.textproducer.font.size</param-name>
            <param-value>43</param-value>
        </init-param>
        <!-- 干扰线的颜色 -->
        <init-param>
            <param-name>kaptcha.noise.color</param-name>
            <param-value>black</param-value>
        </init-param>
        <!-- 字符个数 -->
        <init-param>
            <param-name>kaptcha.textproducer.char.length</param-name>
            <param-value>4</param-value>
        </init-param>
        <!-- 字体 -->
        <init-param>
            <param-name>kaptcha.textproducer.font.names</param-name>
            <param-value>Arial</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>Kaptcha</servlet-name>
        <url-pattern>/Kaptcha</url-pattern>
    </servlet-mapping>

 

假定项目可以通过访问http://localhost:8080/访问,那么此时使用http://localhost:8080/Kaptcha?1234便可访问到验证码图片(图片的内容是1234),在网页中可以将<img>标签的src属性设置为http://localhost:8080/Kaptcha?1234,这样<img>标签就可以显示对应的验证码图片了。当然了,为了让验证码是点击可更换的,我们就不能将Kaptcha?1234这里的参数写死,可以通过js随机产生四位数,然后拼到问号后面的参数。

在后端,我们可以通过HttpServletRequest对象获取这个随机生成的验证码数值。代码可以参考如下:

import javax.servlet.http.HttpServletRequest;

public class CodeUtil {
    /**
     * 检查验证码是否和预期相符
     *
     * @param request
     * @return
     */
    public static boolean checkVerifyCode(HttpServletRequest request) {
        String verifyCodeExpected = (String) request.getSession()
                .getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);
        String verifyCodeActual = HttpServletRequestUtil.getString(request, "verifyCodeActual");
        if (verifyCodeActual == null || !verifyCodeActual.equals(verifyCodeExpected)) {
            return false;
        }
        return true;
    }
}

这里的HttpServletRequest对象可以从controller中获取。上述代码中,verifyCodeExpected是系统随机产生的值(即验证码图片上真正的值),而verifyCodeActual是表单输入的值。重点看verifyCodeExpected的获取。这里只要配合前端,就能简单实现验证码检验的功能。

posted @ 2019-10-10 22:08  陈玉林  阅读(384)  评论(0编辑  收藏  举报