一个Struts2验证码生成插件JCaptcha4Struts2的使用经历

    最近在做一个网站,涉及到用户注册时验证码生成的部分。以前也没弄过,就谷歌了一把,发现了一个Struts2的验证码生成插件。网址是: http://code.google.com/p/jcaptcha4struts2/
按照开发指导步骤完成了相应的配置,用这个东西还是比较方便的。但是在使用过程中也碰到了不少的问题,现在与大家分享一下,以免走弯路。
1、首先是配置的问题。
依赖的包首先是Struts的jar包了,这里就不多说了。
另外当然是这个插件包:可以从网站上下载jcaptcha4struts\jcaptcha4struts2-2.0.2.jar
还有这两个包jcaptcha-1.0-all.jar跟imaging-01012005.jar
QuickStart: http://code.google.com/p/jcaptcha4struts2/wiki/QuickStart上面说了两种使用方式。我这里采用的是拦截器第二种方式
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包。嗯把这个包加上去就可以了

生成之后发现图片太大,把其他的元素都挤到一边去了,这个好办,发现jcaptcha:image里面有属性,高度跟宽度。。设置相应的高度和宽度就可以了。然而杯具发生了 ,设置高度跟宽度不管用。看下面的代码(这个可以项目的源代码,没想到会出现这样的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、生成的图片不好辨认。。
如图所示,是我调整好一切之后在界面上的展示,但是缺点是生成的图片太不好辨认了。。
这一点比较郁闷。。


总结:这个插件还有不少的问题有待改进。比如高度不能调整。生成的图片不好辨认等问题。另外拦截器没有得到调用,暂时还不知道是什么原因,有待进一步研究。

拦截器没有调用成功,发现是配置的问题,按照指导原文的配置是有问题的,如下:
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>

你可能感兴趣的:(bean,jsp,struts,Google,ITeye)