经过研读jcaptcha验证码实现的过程,生成的验证码存放在CaptchaStore中store中,store属于内部变量,当集群时,进行验证时,由A计算机到B计算机进行验证,B计算机CaptchaStore中store中得不到当前验证码,无法进行验证。所以想了想只有通过session来存取当前的验证码变量来实现。
重写CaptchaStore
package com.dzf.core.security.jcaptcha;
import java.util.Collection;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import com.octo.captcha.Captcha;
import com.octo.captcha.service.CaptchaServiceException;
public interface CaptchaStore{
public abstract boolean hasCaptcha(String paramString);
/** @deprecated */
public abstract void storeCaptcha(String paramString, Captcha paramCaptcha)
throws CaptchaServiceException;
public abstract void storeCaptcha(String paramString, Captcha paramCaptcha, Locale paramLocale)
throws CaptchaServiceException;
public abstract boolean removeCaptcha(String paramString);
public abstract Captcha getCaptcha(String paramString)
throws CaptchaServiceException;
public abstract Locale getLocale(String paramString)
throws CaptchaServiceException;
public abstract int getSize();
public abstract Collection getKeys();
public abstract void empty();
public abstract void initAndStart();
public abstract void cleanAndShutdown();
public abstract void setRequest(HttpServletRequest request);
public abstract HttpServletRequest getRequest();
}
/*
* JCaptcha, the open source java framework for captcha definition and integration
* Copyright (c) 2007 jcaptcha.net. All Rights Reserved.
* See the LICENSE.txt file distributed with this package.
*/
package com.dzf.core.security.jcaptcha;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import com.octo.captcha.Captcha;
import com.octo.captcha.service.CaptchaServiceException;
import com.octo.captcha.service.captchastore.CaptchaAndLocale;
/**
* Simple store based on a HashMap
*/
public class SessionCaptchaStore implements CaptchaStore {
HttpServletRequest request;
HttpSession store;
List<String> keySet;
public static String SESSIONCAPTCHA="session_captcha";
public HttpServletRequest getRequest() {
return request;
}
public void setRequest(HttpServletRequest request) {
this.request = request;
}
public SessionCaptchaStore() {
this.keySet = new ArrayList<String>();
}
/**
* Check if a captcha is stored for this id
*
* @return true if a captcha for this id is stored, false otherwise
*/
public boolean hasCaptcha(String id) {
return request.getSession().getAttribute(SESSIONCAPTCHA+id)!=null;
}
/**
* Store the captcha with the provided id as key. The key is assumed to be unique, so if the same key is used twice
* to store a captcha, the store will return an exception
*
* @param id the key
* @param captcha the captcha
*
* @throws CaptchaServiceException if the captcha already exists, or if an error occurs during storing routine.
*/
public void storeCaptcha(String id, Captcha captcha) throws CaptchaServiceException {
keySet.add(SESSIONCAPTCHA+id);
request.getSession().setAttribute(SESSIONCAPTCHA+id, new CaptchaAndLocale(captcha));
}
/**
* Store the captcha with the provided id as key. The key is assumed to be unique, so if the same key is used twice
* to store a captcha, the store will return an exception
*
* @param id the key
* @param captcha the captcha
* @param locale the locale used that triggers the captcha generation
* @throws com.octo.captcha.service.CaptchaServiceException
* if the captcha already exists, or if an error occurs during storing routine.
*/
public void storeCaptcha(String id, Captcha captcha, Locale locale) throws CaptchaServiceException {
keySet.add(SESSIONCAPTCHA+id);
request.getSession().setAttribute(SESSIONCAPTCHA+id, new CaptchaAndLocale(captcha,locale));
}
/**
* Retrieve the captcha for this key from the store.
*
* @return the captcha for this id
*
* @throws CaptchaServiceException if a captcha for this key is not found or if an error occurs during retrieving
* routine.
*/
public Captcha getCaptcha(String id) throws CaptchaServiceException {
Object captchaAndLocale = request.getSession().getAttribute(SESSIONCAPTCHA+id);
return captchaAndLocale!=null?((CaptchaAndLocale) captchaAndLocale).getCaptcha():null;
}
/**
* Retrieve the locale for this key from the store.
*
* @return the locale for this id, null if not found
* @throws com.octo.captcha.service.CaptchaServiceException
* if an error occurs during retrieving routine.
*/
public Locale getLocale(String id) throws CaptchaServiceException {
Object captchaAndLocale = request.getSession().getAttribute(SESSIONCAPTCHA+id);
return captchaAndLocale!=null?((CaptchaAndLocale) captchaAndLocale).getLocale():null;
}
/**
* Remove the captcha with the provided id as key.
*
* @param id the key
*
* @return true if found, false otherwise
*
* @throws CaptchaServiceException if an error occurs during remove routine
*/
public boolean removeCaptcha(String id) {
if (request.getSession().getAttribute(SESSIONCAPTCHA+id) != null) {
keySet.remove(SESSIONCAPTCHA+id);
request.getSession().removeAttribute(SESSIONCAPTCHA+id);
return true;
}
return false;
}
/**
* get the size of this store
*/
public int getSize() {
return keySet.size();
}
/**
* Return all the contained keys
*/
public Collection getKeys() {
return keySet;
}
/**
* Empty the store
*/
public void empty() {
for (Iterator<String> iterator = keySet.iterator(); iterator.hasNext();) {
String key = iterator.next();
keySet.remove(key);
request.getSession().removeAttribute(key);
}
}
public void cleanAndShutdown() {
// TODO Auto-generated method stub
}
public void initAndStart() {
// TODO Auto-generated method stub
}
}
分享到:
相关推荐
Java 通过 JCaptcha 生成验证码是一项常见的安全技术,用于防止自动化程序(如机器人)非法访问或操作网站。验证码,全称“全自动区分计算机和人类的图灵测试”,是一种验证用户是否为人类的方法。在此,我们将深入...
综上,虽然Jcaptcha在Spring MVC中实现验证码验证提供了便利,但在实际部署时,需要考虑其局限性并采取相应的解决策略,以确保系统的稳定性和用户体验。开发者也可以考虑使用其他验证码库,如Google的reCAPTCHA,它...
6. **处理Session问题**:由于Jcaptcha不推荐将验证码存储在Session中,可以考虑使用Cookie或其他无状态方式存储验证码。这种方式在分布式或集群环境下更适用。 7. **优化验证码质量**:如果发现生成的验证码质量较...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
Java 3DMenu 界面源码 5个目标文件 内容索引:Java源码,窗体界面,3DMenu Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都...