一、验证码(公共全自动程序)
验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上是用验证码是现在很多网站通行的方式(比如招商银行的网上个人银行,百度社区),我们利用比较简易的方式实现了这个功能。
该段摘自百度百科(词条:验证码)
二、把验证码功能封装到servlet中
该代码已更新,相关文章也更新。如有需要请参考:在servlet中生成验证码图片(二)
(http://blog.csdn.net/binbinxyz/article/details/18163335)
<script src="https://code.csdn.net/snippets/151752.js"></script>
package org.hbin.demo;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 验证码图片
*
* @file org/hbin/demo/CheckcodeImageServlet.java
* @author hbin
* @version 1.0
* @date 2014/01/10
*/
public class CheckcodeImageServlet extends HttpServlet
{
private static final long serialVersionUID = -6364300384695076278L;
/**
*
* 字符字典
*
* 验证码图片中使用的字符均取自该字符串。
*/
private static final String MAP = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
/**
* 随机数发生器
*/
private static final Random r = new Random();
/**
* 随机生成一种颜色
*
* @return
*/
private Color generateRandomColor()
{
return new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255));
}
/**
* 根据指定字符字典,生成指定长度的随机字符串
*
* @param map
* @param length
* @return
*/
private String generateRandomString(String map, int length)
{
StringBuffer b = new StringBuffer();
for (int i = 0; i < length; i++)
{
b.append(map.charAt(r.nextInt(map.length())));
}
return b.toString();
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
doPost(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
// 设置响应类型为图片
resp.setContentType("image/jpeg");
// 生成4位长度的验证码
String checkcode = generateRandomString(MAP, 4);
// 将生成的验证码字符存入session
req.getSession(true).setAttribute("checkcode", checkcode.toLowerCase());
int width = 100;
int height = 30;
// 在内存中创建图象
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// 创建该图片的绘图对象
Graphics2D g = image.createGraphics();
g.setColor(Color.GRAY);
// 填充背景色
g.fillRect(0, 0, width, height);
Font font = new Font("Times New Roman", Font.PLAIN, 20);
g.setFont(font);
// 随机干扰
for (int i = 0; i < 10; i++)
{
g.setColor(generateRandomColor());
g.drawLine(r.nextInt(width), r.nextInt(height), r.nextInt(width),
r.nextInt(height));
}
// 将验证码字符绘到图象中
for (int i = 0; i < 4; i++)
{
g.setColor(generateRandomColor());
String s = Character.toString(checkcode.charAt(i));
g.drawString(s, 20 * i + 10, height - 6);
}
// 获取页面输出流
ServletOutputStream out = resp.getOutputStream();
// 输出图像
ImageIO.write(image, "jpeg", out);
// 刷新
out.flush();
}
}