1、首先是基本属性类CaptchaConstant.java
package com.baofoo.web.captcha;
import java.awt.Color;
import java.awt.Font;
public class CaptchaConstant {
/**
* 默认字体名
*/
public static final String DEFAULT_FONT_NAME = "Courier";
/**
* 默认字体大小
*/
public static final int DEFAULT_FONT_SIZE = 25;
/**
* 粗体,斜体等
*/
public static final int DEFAULT_FONT_TYPE = Font.BOLD;
/**
* 无干扰
*/
public static final String NOISE_NONE = "none";
/**
* 随机类型的干扰
*/
public static final String NOISE_RANDOM = "random";
/**
* 对应 nl.captcha.noise.CurvedLineNoiseProducer
*/
public static final String NOISE_CURVED = "curved";
/**
* 对应 nl.captcha.noise.StraightLineNoiseProducer
*/
public static final String NOISE_STRAIGHT = "straight";
/**
* 默认干扰
*/
public static final String DEFAULT_NOISE = NOISE_RANDOM;
/**
* 默认干扰线颜色
*/
public static final Color DEFAULT_NOISE_COLOR = Color.darkGray;
/**
* 默认干扰线宽度
*/
public static final int DEFAULT_NOISE_WIDTH = 2;
/**
* 默认宽度
*/
public static final int DEFAULT_WIDTH = 120;
/**
* 默认高度
*/
public static final int DEFAULT_HEIGHT = 30;
/**
* 对应 nl.captcha.text.producer.DefaultTextProducer,除i,o以外的字母
*/
public static final String TEXT_WORD = "word";
/**
* 对应 nl.captcha.text.producer.ChineseTextProducer
*/
public static final String TEXT_CHINESE = "chinese";
/**
* 对应 nl.captcha.text.producer.DefaultTextProducer,除i,o以外的字母及除1,0以外的数字
*/
public static final String TEXT_DEFAULT = "default";
/**
* 对应 nl.captcha.text.producer.DefaultTextProducer,除1,0以外的数字
*/
public static final String TEXT_NUMBER = "number";
/**
* 默认字符
*/
public static final String DEFAULT_TEXT = TEXT_DEFAULT;
/**
* 默认字符长度
*/
public static final int DEFAULT_TEXT_LENGTH = 6;
/**
* 默认字体边框齿轮效果
*/
public static final int DEFAULT_GIMP = 3;
/**
* 默认字体颜色为黑色
*/
public static final Color DEFAULT_TEXT_COLOR = Color.black;
/**
* 随机字体颜色
*/
public static final String TEXT_COLOR_RANDOM = "random";
/**
* 默认背景颜色为白色
*/
public static final Color DEFAULT_BACKGROUND_COLOR = Color.white;
/**
* 这里没有0和1是为了避免歧义 和字母I和O
*/
public static final char[] NUMBER_CHAR = new char[] { '2', '3', '4', '5',
'6', '7', '8' };
/**
* 这里没有I和O是为了避免歧义 和数字0和1
*/
public static final char[] WORD_CHAR = new char[] { 'a', 'b', 'c', 'd',
'e', 'f', 'g', 'h', 'k', 'm', 'n', 'p', 'r', 'w', 'x', 'y' };
/**
* 这里没有I和O和数字0和1是为了避免歧义
*/
public static final char[] DEFAULT_CHAR = new char[] { '2', '3', '4', '5',
'6', '7', '8', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'k', 'm',
'n', 'p', 'r', 'w', 'x', 'y' };
}
2、这个是验证码配置类,可以按照自己的需求来更改属性SimpleCaptchaServlet.java
package com.baofoo.web.captcha;
import java.awt.Color;
import java.awt.Font;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import nl.captcha.Captcha;
import nl.captcha.Captcha.Builder;
import nl.captcha.backgrounds.FlatColorBackgroundProducer;
import nl.captcha.backgrounds.GradiatedBackgroundProducer;
import nl.captcha.gimpy.BlockGimpyRenderer;
import nl.captcha.noise.CurvedLineNoiseProducer;
import nl.captcha.noise.NoiseProducer;
import nl.captcha.noise.StraightLineNoiseProducer;
import nl.captcha.servlet.CaptchaServletUtil;
import nl.captcha.text.producer.ChineseTextProducer;
import nl.captcha.text.producer.DefaultTextProducer;
import nl.captcha.text.renderer.DefaultWordRenderer;
import nl.captcha.text.renderer.WordRenderer;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.RandomUtils;
import com.baofoo.exception.ServiceException;
/**
* 扩展默认的simpleCaptcha
*
* @author yuqih
*
*/
public class SimpleCaptchaServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* 宽度
*/
protected int _width;
/**
* 高度
*/
protected int _height;
/**
* 干扰
*/
protected List<NoiseProducer> _noiseList;
/**
* 是否加边框
*/
protected boolean _border;
/**
* 文字
*/
protected List<Text> _text;
/**
* 字体
*/
protected Font _font;
/**
* 背景色
*/
protected Color _backgroundColor;
/**
* 渐进开始背景色
*/
protected Color _backgroundColorFrom;
/**
* 渐进结束背景色
*/
protected Color _backgroundColorTo;
/**
* 是否渐进背景
*/
private boolean _gradiatedBackground;
/**
* 字体颜色
*/
protected Color _textColor;
/**
* 字体边框齿轮效果, 默认3
*/
protected int _gimp;
@Override
public void init() throws ServletException {
initHeight();
initWidth();
initNoise();
initBorder();
initText();
initBackgroundColor();
initTextColor();
initFont();
initGimp();
}
/**
* 获取图片只会有get方法
*/
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String captchaName = request.getParameter("captcha");
if (StringUtils.isBlank(captchaName)) {
captchaName = Captcha.NAME;
}
Builder builder = new Captcha.Builder(_width, _height);
// 增加边框
if (_border) {
builder.addBorder();
}
// 增加干扰
if (_noiseList != null && _noiseList.size() != 0) {
builder.addNoise(_noiseList.get(RandomUtils.nextInt(_noiseList
.size())));
}
// ----------------自定义字体大小-----------
// 自定义设置字体颜色和大小 最简单的效果 多种字体随机显示
List<Font> fontList = new ArrayList<Font>();
fontList.add(_font);
WordRenderer wr = new DefaultWordRenderer(Arrays.asList(_textColor),
fontList);
// 增加文本
for (Text text : _text) {
if (CaptchaConstant.TEXT_CHINESE.equals(text.type)) {
builder.addText(new ChineseTextProducer(text.length), wr);
} else if (CaptchaConstant.TEXT_NUMBER.equals(text.type)) {
builder.addText(new DefaultTextProducer(text.length,
CaptchaConstant.NUMBER_CHAR), wr);
} else if (CaptchaConstant.TEXT_WORD.equals(text.type)) {
builder.addText(new DefaultTextProducer(text.length,
CaptchaConstant.WORD_CHAR), wr);
} else {
builder.addText(new DefaultTextProducer(text.length,
CaptchaConstant.DEFAULT_CHAR), wr);
}
}
if (_gradiatedBackground) {
// --------------添加背景-------------
// 设置背景渐进效果 以及颜色 form为开始颜色,to为结束颜色
GradiatedBackgroundProducer gbp = new GradiatedBackgroundProducer();
gbp.setFromColor(_backgroundColorFrom);
gbp.setToColor(_backgroundColorTo);
builder.addBackground(gbp);
} else {
FlatColorBackgroundProducer fbp = new FlatColorBackgroundProducer(
_backgroundColor);
builder.addBackground(fbp);
}
// ---------装饰字体---------------
// 字体边框齿轮效果
builder.gimp(new BlockGimpyRenderer(_gimp));
Captcha captcha = builder.build();
request.getSession().setAttribute(captchaName, captcha);
CaptchaServletUtil.writeImage(response, captcha.getImage());
}
private void initGimp() {
String gimp = getInitParameter("gimp");
if (gimp != null) {
_gimp = Integer.parseInt(gimp);
} else {
_gimp = CaptchaConstant.DEFAULT_GIMP;
}
}
private void initHeight() {
String height = getInitParameter("height");
if (height != null) {
_height = Integer.valueOf(height);
} else {
_height = CaptchaConstant.DEFAULT_HEIGHT;
}
}
private void initWidth() {
String width = getInitParameter("width");
if (width != null) {
_width = Integer.valueOf(width);
} else {
_width = CaptchaConstant.DEFAULT_WIDTH;
}
}
private void initNoise() {
String noise = getInitParameter("noise");
String noiseColorStr = getInitParameter("noiseColor");
String noiseWidthStr = getInitParameter("noiseWidth");
Color noiseColor;
int noiseWidth;
if (!StringUtils.isBlank(noiseColorStr)) {
noiseColor = new Color(Integer.parseInt(noiseColorStr, 16));
} else {
noiseColor = CaptchaConstant.DEFAULT_NOISE_COLOR;
}
if (!StringUtils.isBlank(noiseWidthStr)) {
noiseWidth = Integer.parseInt(noiseWidthStr);
} else {
noiseWidth = CaptchaConstant.DEFAULT_NOISE_WIDTH;
}
_noiseList = getNoise(noise, noiseColor, noiseWidth);
}
private List<NoiseProducer> getNoise(String noiseType, Color noiseColor,
int noiseWidth) {
List<NoiseProducer> noise;
if (noiseType == null) {
noise = null;
} else if (noiseType.equals(CaptchaConstant.NOISE_NONE)) {
noise = null;
} else if (noiseType.equals(CaptchaConstant.NOISE_CURVED)) {
noise = new ArrayList<NoiseProducer>();
noise.add(new CurvedLineNoiseProducer(noiseColor, noiseWidth));
} else if (noiseType.equals(CaptchaConstant.NOISE_STRAIGHT)) {
noise = new ArrayList<NoiseProducer>();
noise.add(new StraightLineNoiseProducer(noiseColor, noiseWidth));
} else if (noiseType.equals(CaptchaConstant.NOISE_RANDOM)) {
noise = new ArrayList<NoiseProducer>();
noise.add(new StraightLineNoiseProducer(noiseColor, noiseWidth));
noise.add(new CurvedLineNoiseProducer(noiseColor, noiseWidth));
} else {
noise = getNoise(CaptchaConstant.DEFAULT_NOISE, noiseColor,
noiseWidth);
}
return noise;
}
private void initBorder() {
String border = getInitParameter("border");
if (border != null) {
_border = Boolean.valueOf(border);
} else {
_border = true;
}
}
private void initText() {
_text = new ArrayList<Text>();
String text = getInitParameter("text");
if (text == null) {
_text.add(new Text(CaptchaConstant.DEFAULT_TEXT,
CaptchaConstant.DEFAULT_TEXT_LENGTH));
return;
}
String[] ts = text.split(",");
for (int i = 0; i < ts.length; i++) {
String[] ts1 = ts[i].split(":");
String textType = ts1[0];
int length = Integer.parseInt(ts1[1]);
if (isTextValid(textType, length)) {
_text.add(new Text(textType, length));
} else {
throw new ServiceException("暂不支持");
}
}
}
private boolean isTextValid(String text, int length) {
if (length < 1) {
return false;
}
if (StringUtils.isBlank(text)) {
return false;
}
if (text.equals(CaptchaConstant.TEXT_CHINESE)
|| text.equals(CaptchaConstant.TEXT_DEFAULT)
|| text.equals(CaptchaConstant.TEXT_NUMBER)
|| text.equals(CaptchaConstant.TEXT_WORD)) {
return true;
}
return false;
}
private void initBackgroundColor() {
String backgroundColor = getInitParameter("backgroundColor");
String backgroundColorFrom = getInitParameter("backgroundColorFrom");
String backgroundColorTo = getInitParameter("backgroundColorTo");
if (backgroundColorFrom == null || backgroundColorTo == null) {
_gradiatedBackground = false;
if (backgroundColor == null) {
_backgroundColor = CaptchaConstant.DEFAULT_BACKGROUND_COLOR;
} else {
_backgroundColor = new Color(Integer.parseInt(backgroundColor,
16));
}
} else {
_gradiatedBackground = true;
_backgroundColorFrom = new Color(Integer.parseInt(
backgroundColorFrom, 16));
_backgroundColorTo = new Color(Integer.parseInt(backgroundColorTo,
16));
}
}
private void initTextColor() {
String textColor = getInitParameter("textColor");
if (textColor == null) {
_textColor = CaptchaConstant.DEFAULT_TEXT_COLOR;
} else {
_textColor = new Color(Integer.parseInt(textColor, 16));
}
}
private void initFont() {
String font = getInitParameter("fontName");
String fontType = getInitParameter("fontType");
String fontSize = getInitParameter("fontSize");
int type;
int size;
if (font == null) {
font = CaptchaConstant.DEFAULT_FONT_NAME;
}
if (StringUtils.isBlank(fontType)) {
type = CaptchaConstant.DEFAULT_FONT_TYPE;
} else {
type = Integer.parseInt(fontType);
}
if (StringUtils.isBlank(fontSize)) {
size = CaptchaConstant.DEFAULT_FONT_SIZE;
} else {
size = Integer.parseInt(fontSize);
}
_font = new Font(font, type, size);
}
private class Text {
String type;
int length;
Text(String type, int length) {
this.type = type;
this.length = length;
}
}
}
3、web.xml文件的配置(这里可以自定义一些基本属性)
<servlet> <servlet-name>VerifyCodeServlet</servlet-name> <servlet-class>com.baofoo.web.captcha.SimpleCaptchaServlet</servlet-class> <init-param> <param-name>backgroundColorFrom</param-name> <param-value>3F526C</param-value> </init-param> <init-param> <param-name>backgroundColorTo</param-name> <param-value>3E506A</param-value> </init-param> <init-param> <param-name>textColor</param-name> <param-value>ffffff</param-value> </init-param> <init-param> <param-name>border</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>width</param-name> <param-value>100</param-value> </init-param> <init-param> <param-name>height</param-name> <param-value>40</param-value> </init-param> <init-param> <param-name>text</param-name> <param-value>number:6</param-value> </init-param> <init-param> <param-name>noise</param-name> <param-value>random</param-value> </init-param> <init-param> <param-name>gimp</param-name> <param-value>2</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>VerifyCodeServlet</servlet-name> <url-pattern>/verifyCodeServlet</url-pattern> </servlet-mapping>
4、JSP页面的使用
<img id="CaptchaImg" src="${ctx}/verifyCodeServlet?refresh=
<%=System.currentTimeMillis()%>" οnclick="refreshImg()" />
这里${ctx}是web项目路径
转载于:https://blog.51cto.com/peterz2011/1600618