转自:http://blog.csdn.net/s20081294/article/details/44458515?ref=myread
在html中:
<img src="/dev/code_makeImg.action" alt="" width="130px" height="53px"/>
后台程序:
import java.awt.Color;
import java.awt.Font;import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.wangding.action.BaseAction;
public class ImgMakeAction extends BaseAction
{
private static int WIDTH = 90;// 设置图片的宽度
private static int HEIGHT = 22;// 设置图片的高度
/** 图片验证码
*
* @param mapping
* @param form
* @param request
* @param response
* @return
* @throws Exception */
public void makeImg() throws Exception
{
// 设置返回类型为 :IMAGE/JPEG的形式图片
HttpServletRequest request = this.getRequest();
HttpServletResponse response = this.getResponse();
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
HttpSession session = request.getSession();
response.setContentType("image/jpeg");
// 使用SERVLET的输出流来接收返回的输入流信息
ServletOutputStream sos = response.getOutputStream();
// 通过有参数的构造方法来初始化图片类
BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
// 使用字符数组来接受动态生成字符
char[] rands = generateCheckCode();
drawBackground(g);
drawRands(g, rands);
g.dispose();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ImageIO.write(image, "JPEG", bos);
byte[] buf = bos.toByteArray();
response.setContentLength(buf.length);
// 将生成的图片信息进行打印输出
sos.write(buf);
// 关闭输出流
bos.close();
// 关闭输出流
sos.close();
// 将动态生成的字符进行SESSION范围内的存储
session.setAttribute("token", new String(rands));
}
/** 随机生成图片背景
*
* @param g */
private void drawBackground(Graphics g)
{
g.setColor(new Color(0xDCDCDC));
g.fillRect(0, 0, WIDTH, HEIGHT);
for (int i = 0; i < 120; i++)
{
int x = (int) (Math.random() * WIDTH);
int y = (int) (Math.random() * HEIGHT);
int red = (int) (Math.random() * 255);
int green = (int) (Math.random() * 255);
int blue = (int) (Math.random() * 255);
g.setColor(new Color(red, green, blue));
g.drawOval(x, y, 1, 0);
}
}
/** 设置动态图片属性
*
* @param g
* @param rands */
private void drawRands(Graphics g, char[] rands)
{
Random random = new Random();
int red = random.nextInt(110);
int green = random.nextInt(50);
int blue = random.nextInt(50);
g.setColor(new Color(red, green, blue));
g.setFont(new Font(null, Font.BOLD, 18));
g.drawString("" + rands[0], 1, 17);
g.drawString("" + rands[1], 16, 17);
g.drawString("" + rands[2], 31, 17);
g.drawString("" + rands[3], 46, 17);
g.drawString("" + rands[4], 61, 17);
g.drawString("" + rands[5], 76, 17);
}
/** 动态生成字符数组
*
* @return rands */
private char[] generateCheckCode()
{
String chars = "0123456789abcdefghijklmnopqrstuvwxyz";
char[] rands = new char[6];
for (int i = 0; i < 6; i++)
{
int rand = (int) (Math.random() * 36);
rands[i] = chars.charAt(rand);
}
return rands;
}
}