1、简述:jcaptcha是java生成图形验证码非常好的api,入手简单,配置简单,使用很少的代码完成了生成图形验证码功能
读过源码,我们知道jcaptcha通过sessionId来验证验证码的正确性
2、问题:tomcat服务器启动web应用后,会为每个用户生成一个sessionId,以此区别不同用户。由于现在的企业级web应用都比较大,通常会部署在多个tomcat服务器上,这样就产生了问题,A服务器生成的sessionId,在B服务器是没有的,假如用户在访问的是A服务器,接着可能是访问的B服务器,由于每个sessionId是根据web服务器来生成的,而服务器间不能共享互通。所以如果根据tomcat的sessionId来识别验证码正确性就出现了问题。
3、解决办法:思路,把sessionId放在redis等支持集群模式的缓存中,实现了共享互通。
pom.xml引入jar
<dependency>
<groupId>com.octo.captcha</groupId>
<artifactId>jcaptcha</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
<exclusion>
<groupId>com.jhlabs</groupId>
<artifactId>imaging</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-juli</artifactId>
</exclusion>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
</exclusions>
</dependency>
第一种实现方式:通过UUID生成sessionId,把sessionId存到redis中
java config方式配置bean
@Configuration
//@Import(BaseWebMvcConfig.class)
public class AppConfig extends BaseAppConfig {
}
public class BaseAppConfig {
@Bean
public CaptchaStore getCaptchaStore(){
return new FastHashMapCaptchaStore();
}
@Bean
public AbstractManageableImageCaptchaService captchaService(CaptchaStore captchaStore){
// GenericManageableCaptchaService service = new GenericManageableCaptchaService(cSRCaptchaEngine(),300,20000);
// System.out.println("------------GenericManageableCaptchaService 验证码 init--------------------");
return new AbstractManageableImageCaptchaService(captchaStore, cSRCaptchaEngine(), 60, 100000, 75000){};
}
public ListImageCaptchaEngine cSRCaptchaEngine() {
return new ListImageCaptchaEngine() {
@Override
protected void buildInitialFactories() {
System.out.println("---------CSRCaptchaEngine buildInitialFactories2------ ");
int minW