首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

Kaptcha应用

2012-09-08 
Kaptcha使用简单的装备起来很简单,网上一大把,就不说了。但是许多时候因为产品啊,领导啊等等什么的需求就出

Kaptcha使用
简单的装备起来很简单,网上一大把,就不说了。
但是许多时候因为产品啊,领导啊等等什么的需求就出来了,怎么去让它适应需求?

1.kaptcha可配置项:

kaptcha.border  是否有边框  默认为true  我们可以自己设置yes,nokaptcha.border.color   边框颜色   默认为Color.BLACKkaptcha.border.thickness  边框粗细度  默认为1kaptcha.producer.impl   验证码生成器  默认为DefaultKaptchakaptcha.textproducer.impl   验证码文本生成器  默认为DefaultTextCreatorkaptcha.textproducer.char.string   验证码文本字符内容范围  默认为abcde2345678gfynmnpwxkaptcha.textproducer.char.length   验证码文本字符长度  默认为5kaptcha.textproducer.font.names    验证码文本字体样式  默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)kaptcha.textproducer.font.size   验证码文本字符大小  默认为40kaptcha.textproducer.font.color  验证码文本字符颜色  默认为Color.BLACKkaptcha.textproducer.char.space  验证码文本字符间距  默认为2kaptcha.noise.impl    验证码噪点生成对象  默认为DefaultNoisekaptcha.noise.color   验证码噪点颜色   默认为Color.BLACKkaptcha.obscurificator.impl   验证码样式引擎  默认为WaterRipplekaptcha.word.impl   验证码文本字符渲染   默认为DefaultWordRendererkaptcha.background.impl   验证码背景生成器   默认为DefaultBackgroundkaptcha.background.clear.from   验证码背景颜色渐进   默认为Color.LIGHT_GRAYkaptcha.background.clear.to   验证码背景颜色渐进   默认为Color.WHITEkaptcha.image.width   验证码图片宽度  默认为200kaptcha.image.height  验证码图片高度  默认为50 


2.kaptcha提供了很好的可扩展性,而且扩展的方式也很简单,只需要实现相关接口,然后把我们自定义的对象添加到配置项里面就可以了,如Producer,WordRenderer,GimpyEngine,BackgroundProducer,NoiseProducer,TextProducer这些接口,我们可以随意的扩展。

3.关于对生成的验证码进行加噪点,一些干扰因素,kaptcha也提供了许多现成的filter供选择,它自己默认的干扰因素生成类WaterRipple就是由RippleFilter,WaterFilter两个filter组成的,这些filter实现了各种对文本样式变化处理,位于com.jhlabs.image package下。

自己实现一个WordRenderer
public class ZHWordRenderer  extends Configurable implements WordRenderer{    public ZHWordRenderer()    {    }    public BufferedImage renderWord(String word, int width, int height)    {        int fontSize = getConfig().getTextProducerFontSize();// 这个地方我们自定义了验证码文本字符样式,虽然是可以配置的,但是字体展示都粗体,我们希望不是粗体就只有自定义这个渲染类了        String paramName = "kaptcha.textproducer.font.names";    String paramValue = (String)getConfig().getProperties().get(paramName);    String fontNames[] = paramValue.split(",");    Font fonts[] = new Font[fontNames.length];        for(int i = 0; i < fontNames.length; i++){            fonts[i] = new Font(fontNames[i], Font.ITALIC, fontSize);        }        java.awt.Color color = getConfig().getTextProducerFontColor();        int charSpace = getConfig().getTextProducerCharSpace();        BufferedImage image = new BufferedImage(width, height, 2);        Graphics2D g2D = image.createGraphics();                g2D.setColor(color);        RenderingHints hints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);        hints.add(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY));                g2D.setRenderingHints(hints);        java.awt.font.FontRenderContext frc = g2D.getFontRenderContext();        Random random = new Random();        int startPosY = (height - fontSize) / 5 + fontSize;        char wordChars[] = word.toCharArray();        Font chosenFonts[] = new Font[wordChars.length];        int charWidths[] = new int[wordChars.length];        int widthNeeded = 0;        for(int i = 0; i < wordChars.length; i++)        {            chosenFonts[i] = fonts[random.nextInt(fonts.length)];            char charToDraw[] = {                wordChars[i]            };            GlyphVector gv = chosenFonts[i].createGlyphVector(frc, charToDraw);            charWidths[i] = (int)gv.getVisualBounds().getWidth();            if(i > 0)                widthNeeded += 2;            widthNeeded += charWidths[i];        }        int startPosX = (width - widthNeeded) / 2;        for(int i = 0; i < wordChars.length; i++)        {            g2D.setFont(chosenFonts[i]);            char charToDraw[] = {                wordChars[i]            };            g2D.drawChars(charToDraw, 0, charToDraw.length, startPosX, startPosY);            startPosX = startPosX + charWidths[i] + charSpace;        }        return image;    }}

热点排行