使用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 |
读者可以根据自己的需要来选择,自己可以实验一下,还是蛮有趣的。