在Grails安全验证插件分类中有几个和验证码相关的插件。
Simple Captcha Plugin : 比较简单的实现了图片显示验证码
JCaptcha Plugin :基于 JCaptcha 开源图片和音频验证码项目的Grails插件
ReCaptcha Plugin :基于 ReCaptcha 开源图片和音频验证码项目的Grails插件
这次主要介绍如何使用 JCaptcha 插件,因为JCaptcha相对比较成熟和稳定,功能完善可调整的内容也比较丰富。
安装
在 http://plugins.grails.org 网站下载 JCaptcha 插件。
然后进入你的项目目录, grails install-plugin %path%/grails-jcaptcha-0.2.zip
这里没有使用Grails的自动安装因为那样很慢,而且Grails自己下载也不支持断点,所以还是自己下载来的方便,特别是比较大的插件。
配置
在grails-app/conf/Config.groovy 文件中 定义验证器(captchas),
定义例子如下:
import java.awt.Font import java.awt.Color import com.octo.captcha.service.multitype.GenericManageableCaptchaService import com.octo.captcha.engine.GenericCaptchaEngine import com.octo.captcha.image.gimpy.GimpyFactory import com.octo.captcha.component.word.wordgenerator.RandomWordGenerator import com.octo.captcha.component.image.wordtoimage.ComposedWordToImage import com.octo.captcha.component.image.fontgenerator.RandomFontGenerator import com.octo.captcha.component.image.backgroundgenerator.GradientBackgroundGenerator import com.octo.captcha.component.image.color.SingleColorGenerator import com.octo.captcha.component.image.textpaster.NonLinearTextPaster jcaptchas { imageCaptcha = new GenericManageableCaptchaService( new GenericCaptchaEngine( new GimpyFactory( new RandomWordGenerator( "abcdefghijklmnopqrstuvwxyz1234567890" ), new ComposedWordToImage( new RandomFontGenerator( 20, // min font size 30, // max font size [new Font("Arial", 0, 10)] as Font[] ), new GradientBackgroundGenerator( 140, // width 35, // height new SingleColorGenerator(new Color(255, 255, 255)), new SingleColorGenerator(new Color(200, 200, 200)) ), new NonLinearTextPaster( 4, // minimal length of text 4, // maximal length of text new Color(11, 11, 11) ) ) ) ), 180, // minGuarantedStorageDelayInSeconds 180000 // maxCaptchaStoreSize ) }
上面的代码是定义了两个验证器(captcha),一个图形验证器 imageCaptcha ,一个音频验证器 soundCaptcha;
imageCaptcha使用了自定义的方式,配置了很多参数。默认的图像验证器是 DefaultManageableImageCaptchaService
soundCaptcha使用了默认的验证器。
你可以配置更多的验证器以及规则,也可以就配置一个,比如这个音频的验证器一般不需要就可以删除掉。如果因为你的业务需要你要一个六字的验证和一个四字的验证,这样的情况就可以配置两个图像验证器。
ps:我在使用音频验证器时grails报错,因为音频使用到了一些音频处理的API,而我没有这些包,所以删除音频验证器以及涉及音频验证器的包即可。如果你确实需要音频验证器,那就你看错误信息,找到这些包然后放在项目的lib里。
ps:安装 JCaptcha 插件时会在plugins中安装插件的项目结构,其中也会安装conf/Config.groovy文件。如果运行Grails发生Config.groovy错误,删除插件中的配置文件即可plugins\jcaptcha-0.2\grails-app\conf\Config.groovy
显示
完成上面的配置之后,你得到一个验证器名称:imageCaptcha 。然后在需要的gsp页面中使用下面的tag。
<jcaptcha:jpeg name="<captchaname>" />
<captchaname>就是你的验证器名称:imageCaptcha
正常的情况下你就可以看到验证图片了。这个验证图片的颜色,字体,大小,内容都可以通过前面的自定义配置去修改和完善。
验证
在控制器中需要验证用户输入的验证码和验证图片中显示的是否一致。首先要在控制器中声明一个jcaptchaService对象,以便spring依赖注入 jcaptchaService 这个类。
然后在具体的验证Action中使用jcaptchaService.validateResponse("imageCaptcha", session.id, params.code)方法具体验证。
第一个参数是你的验证器名称。
第二个参数是比较固定就是 session.id
第三个参数是 页面中填写验证码输入框的内容,根据你的输入框的名字XXX,params.XXX
def jcaptchaService def save = { def user = new User(params) if (!jcaptchaService.validateResponse("captchaName", session.id, params.captchaResponse)) { flash.message = "认证码错误!" return render(view:'index',model:[user:user]) } // other logic }
高级玩法
前面在配置图像验证器时我们已经发现,我们可以通过配置改变验证图片的很多特性。现在深入看看我们都能改变什么。
new RandomWordGenerator("") 可以配置随机生成图片内容的字符范围
new ComposedWordToImage( new RandomFontGenerator( // 生成图片文字的字体以及字号大小,可以是多种字体,会随机出现。 20, // min font size 30, // max font size [new Font("Arial", 0, 10)] as Font[] ), new GradientBackgroundGenerator(// 配置验证图片的大小和背景色以及过渡色 140, // width 35, // height new SingleColorGenerator(new Color(0, 60, 0)), new SingleColorGenerator(new Color(20, 20, 20)) ), new NonLinearTextPaster( 6, // minimal length of text 6, // maximal length of text new Color(0, 255, 0) ) )