本文用的验证码是谷歌的Kaptcha,由于现在的项目多数都是分布式的结构,如果项目中没有session同步的机制,建议把生成的验证码存到Redis里。本文例子是存到Redis中的。
一、首先在maven中加入配置
<!-- kaptcha验证码 -->
<dependency>
<groupId>com.github.axet</groupId>
<artifactId>kaptcha</artifactId>
<version>0.0.9</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
二、新建spring-auchCode.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:c="http://www.springframework.org/schema/c"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置kaptcha验证码 -->
<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.image.width">100</prop>
<!-- 图片高度 -->
<prop key="kaptcha.image.height">50</prop>
<!-- 验证码字符串 -->
<prop key="kaptcha.textproducer.char.string">0123456789abcdefghijklmnopqrstuvwxyz</prop>
<!-- 验证码长度 -->
<prop key="kaptcha.textproducer.char.length">5</prop>
</props>
</constructor-arg>
</bean>
</property>
</bean>
</beans>
三、新建controller,验证码访问入口,将产生的验证码存入Redis
@Controller
@RequestMapping("/auchCode")
public class AuthCodeController {
@Autowired
private DefaultKaptcha captchaProducer;
@Autowired
private BaseRedis baseRedis;
@RequestMapping("/kaptcha")
public void doAuchCode(HttpServletRequest request, HttpServletResponse response) throws Exception{
response.setDateHeader("Expires", 0);
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
response.addHeader("Cache-Control", "post-check=0, pre-check=0");
response.setHeader("Pragma", "no-cache");
response.setContentType("image/jpeg");
String token = (String) request.getAttribute("token");
String capText = captchaProducer.createText();
//redis存值
String redisKey= "PC-kaptcha:"+token;
//rc.SetObjectByKey(redisKey, capText);
baseRedis.setCache("KAPTCHA_AUCHCODE",capText,60);
BufferedImage bi = captchaProducer.createImage(capText);
ServletOutputStream out = response.getOutputStream();
ImageIO.write(bi, "jpg", out);
try {
out.flush();
} finally {
out.close();
}
}
}