最近在做一个网站,涉及到用户注册时验证码生成的部分。以前也没弄过,就谷歌了一把,发现了一个Struts2的验证码生成插件。网址是:[url]http://code.google.com/p/jcaptcha4struts2/[/url]。
按照开发指导步骤完成了相应的配置,用这个东西还是比较方便的。但是在使用过程中也碰到了不少的问题,现在与大家分享一下,以免走弯路。
1、首先是配置的问题。
依赖的包首先是Struts的jar包了,这里就不多说了。
另外当然是这个插件包:可以从网站上下载jcaptcha4struts\jcaptcha4struts2-2.0.2.jar
还有这两个包jcaptcha-1.0-all.jar跟imaging-01012005.jar
QuickStart:[url]http://code.google.com/p/jcaptcha4struts2/wiki/QuickStart[/url]上面说了两种使用方式。我这里采用的是拦截器第二种方式
2、页面校验码生成问题。
配置如下:
<div align="left" class="verifycode">验 证 码:
<jcaptcha:image label="" width="88" height="21" /><div class="errtext2"><span class="myerror"><s:fielderror cssClass="myerror" fieldName="jCaptchaResponse"/></span></div>
</div>
配置好之后,在页面里面居然没有生成验证码的图片。看来的研究下这个验证码图片是如何生成的了。。图片的生成是通过JCaptchaImageAction来做到的,里面有这么个方法。依赖
protected ImageCaptchaService getImageCaptchaService() {
return JC4S2Config.getInstance().getImageCaptchaService();
}
依赖的是
JC4S2Config.getDefaultImageCaptchaService(){
。。。
Class<?> clazz = Class.forName(DEFAULT_IMG_CAPTCHA_IMPL);
return (ImageCaptchaService) clazz.newInstance();
。。。
}
在实例化具体的com.octo.captcha.service.image.DefaultManageableImageCaptchaService对象时候,出错了。发现还需要依赖commons-collections-3.2.1.jar包。嗯把这个包加上去就可以了 :lol:
生成之后发现图片太大,把其他的元素都挤到一边去了,这个好办,发现jcaptcha:image里面有属性,高度跟宽度。。设置相应的高度和宽度就可以了。然而杯具发生了 :cry: ,设置高度跟宽度不管用。看下面的代码(这个可以项目的源代码,没想到会出现这样的bug,然而到现在也没纠正过来)
public Component getBean(ValueStack stack, HttpServletRequest request,
HttpServletResponse response) {
JCaptchaImage bean = new JCaptchaImage(stack, request, response);
// Set attribute values
bean.setWidth(width);
bean.setWidth(height);//这里我想作者本来的意思是设置高度的,没想到设置了两次宽度
bean.setTextSize(textSize);
return bean;
}
没办法这个只好通过css解决了。
3、生成的图片不好辨认。。
如图所示,是我调整好一切之后在界面上的展示,但是缺点是生成的图片太不好辨认了。。
这一点比较郁闷。。
[img]http://dl.iteye.com/upload/attachment/478578/58197ffd-6e08-39fa-b0b9-e3ca07145e61.jpg[/img]
总结:这个插件还有不少的问题有待改进。比如高度不能调整。生成的图片不好辨认等问题。另外拦截器没有得到调用,暂时还不知道是什么原因,有待进一步研究。
拦截器没有调用成功,发现是配置的问题,按照指导原文的配置是有问题的,如下:
Following code snippet from struts.xml shows how this is done.
<package name="mypackage" extends="jcaptcha4struts2-default">
<action name="myformaction" class="com.my.app.FormAction">
<!-- Interceptor Stack -->
<interceptor-ref name="jcaptchaDefaultStack" />
<result name="input">/form.jsp</result>
<result>/done.jsp</result>
</action>
</package>
应该这样配置:
<action name="register" class="com.zhaozh.actions.RegisterAction">
<!-- <interceptor-ref name="jcaptchaDefaultStack"></interceptor-ref> -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="jcaptchaValidation"></interceptor-ref>
<result name="success">/index.jsp</result>
<result name="input">/register.jsp</result>
</action>
4、自定义拦截器,复写父类的方法:
复写是为了中文网页的需求,复写父类的方法,返回中文的提示
public class VerifyCodeInterceptor extends JCaptchaValidationIntercepter {
/**
*
*/
private static final long serialVersionUID = -5166016815535509471L;
@Override
protected String getValidationErrorMessage() {
return "输入的字符串跟图片上的字符串不匹配";
}
}
配置:
<interceptors>
<interceptor name="verifycode"
class="com.zhaozh.intercepter.VerifyCodeInterceptor"></interceptor>
</interceptors>
<action name="register" class="com.zhaozh.actions.RegisterAction">
<!-- <interceptor-ref name="jcaptchaDefaultStack"></interceptor-ref> -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="verifycode"></interceptor-ref>
<result name="success">/index.jsp</result>
<result name="input">/register.jsp</result>
</action>