但是许多时候因为产品啊,领导啊等等什么的需求就出来了,怎么去让它适应需求?
1.kaptcha可配置项:
- kaptcha.border 是否有边框 默认为 true 我们可以自己设置yes,no
- kaptcha.border.color 边框颜色 默认为Color.BLACK
- kaptcha.border.thickness 边框粗细度 默认为1
- kaptcha.producer.impl 验证码生成器 默认为DefaultKaptcha
- kaptcha.textproducer.impl 验证码文本生成器 默认为DefaultTextCreator
- kaptcha.textproducer.char .string 验证码文本字符内容范围 默认为abcde2345678gfynmnpwx
- kaptcha.textproducer.char .length 验证码文本字符长度 默认为 5
- kaptcha.textproducer.font.names 验证码文本字体样式 默认为new Font( "Arial" , 1 , fontSize), new Font( "Courier" , 1 , fontSize)
- kaptcha.textproducer.font.size 验证码文本字符大小 默认为40
- kaptcha.textproducer.font.color 验证码文本字符颜色 默认为Color.BLACK
- kaptcha.textproducer.char .space 验证码文本字符间距 默认为 2
- kaptcha.noise.impl 验证码噪点生成对象 默认为DefaultNoise
- kaptcha.noise.color 验证码噪点颜色 默认为Color.BLACK
- kaptcha.obscurificator.impl 验证码样式引擎 默认为WaterRipple
- kaptcha.word.impl 验证码文本字符渲染 默认为DefaultWordRenderer
- kaptcha.background.impl 验证码背景生成器 默认为DefaultBackground
- kaptcha.background.clear.from 验证码背景颜色渐进 默认为Color.LIGHT_GRAY
- kaptcha.background.clear.to 验证码背景颜色渐进 默认为Color.WHITE
- kaptcha.image.width 验证码图片宽度 默认为200
- kaptcha.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;
- }
- }