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的获取。这里只要配合前端,就能简单实现验证码检验的功能。