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
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; }}