public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 得到 session 对象
HttpSession session = request.getSession();
// 如果保存有旧的验证码则清除
if (session.getAttribute("code") != null) {
session.removeAttribute("code");
}
// 图片的宽度
int width = 60;
// 图片的高度
int height = 20;
// 验证码字符个数
int codeCount = 4;
// 验证码显示位置的x坐标
int x = 0;
// 验证码显示位置的y坐标
int y = 0;
// 验证码输出的内容字符数组
char[] codeSequence = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',
'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6',
'7', '8', '9' };
// 坐标计算
x = width / (codeCount + 1);
// 验证码显示位置的y坐标计算
y = height - 4;
// 字体高度设置
int fontHeight = height - 2;
// 构造图片
BufferedImage buffImg = new BufferedImage(width, height, 1);
// 构造图片的基础类
Graphics2D grap = buffImg.createGraphics();
// 初始化一个随机数组
Random random = new Random();
// 设置图片背景颜色
grap.setColor(Color.WHITE);
// 设置填充的图片的x y 坐标及宽度 高度
grap.fillRect(0, 0, width, height);
// 初始化一个字体对象
Font font = new Font("宋体", 2, fontHeight);
// 设置图片所包含的字体
grap.setFont(font);
// 设置图片显示的边框
grap.drawRect(0, 0, width - 1, height - 1);
// 验证码
StringBuffer randomCode = new StringBuffer();
// 循环
for (int i = 0; i < codeCount; ++i) {
// 得到随机字符
String strRand = String.valueOf(codeSequence[random.nextInt(36)]);
// 设置字符颜色
grap.setColor(new Color(0, 0, 0));
// 设置图片显示的文本
grap.drawString(strRand, (i + 1) * x, y);
// 将当前得到的随机字符加入验证码
randomCode.append(strRand);
}
// 保存至 session 对象
session.setAttribute("code", randomCode.toString());
// 禁止输出页面使用缓存
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
// 设置输出页面过期时间
response.setDateHeader("Expires", 0L);
// 设置输出页面的类型
response.setContentType("image/jpeg");
// 获得一个图片缓冲数据编码对象
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(response
.getOutputStream());
// 编码输出图片
encoder.encode(buffImg);
}