public class ImageCodeAction extends BaseAction{
private InputStream imageStream;//输出
public String execute() {
//1.调用图片生成工具,生成一个图片及验证码;
Map中的key是验证码字符串;map中的value是验证码图片;
Map<String,BufferedImage> map = ImageUtil.createImage();
//2.将map里的key(即验证码)取出
String code = null;
//取出map中的所有key,并放在set集合中;
Set<String> set = map.keySet();
//遍历取出所有的key;
Iterator<String> it = set.iterator();
while(it.hasNext()) {
code = it.next();
}
//3.将取出的map中的key全部放入session,当点击登陆时要从session中获取;
session.put("imageCode", code);
//4.将map里的图片取出(通过map中的key,value取出);
BufferedImage image = map.get(code);
try {
imageStream = ImageUtil.getInputStream(image);
} catch (IOException e) {
return "error";
}
return "success";
}
public InputStream getImageStream() {
return imageStream;
}
public void setImageStream(InputStream imageStream) {
this.imageStream = imageStream;
}
}
ImageUtil工具类如下:
public final class ImageUtil {
private static final char[] chars = { '0', '1', '2', '3', '4', '5', '6','7', '8', '9'};
private static final int SIZE = 4;//验证码上是4个字母;
private static final int LINES = 5;//画5条干扰线;
private static final int WIDTH = 80;//图片宽度;
private static final int HEIGHT = 35;//图片高度;
private static final int FONT_SIZE = 30;
public static Map<String, BufferedImage> createImage() {
//创建一个StringBuffer字符串对象;
StringBuffer sb = new StringBuffer();
//创建一个BufferedImage图片对象;
BufferedImage image = new BufferedImage(WIDTH, HEIGHT,
BufferedImage.TYPE_INT_RGB);
//在创建的图片上添加一个图形对象;
Graphics graphic = image.getGraphics();
//下面这两句是给一个正方形图形填充背景色;
graphic.setColor(Color.LIGHT_GRAY);
graphic.fillRect(0, 0, WIDTH, HEIGHT);
Random ran = new Random();
// 在正方形图形上画4个随机字符
for (int i = 1; i <= SIZE; i++) {
int r = ran.nextInt(chars.length);
graphic.setColor(getRandomColor());
graphic.setFont(new Font(null, Font.BOLD + Font.ITALIC, FONT_SIZE));
graphic.drawString(chars[r] + "", (i - 1) * WIDTH / SIZE,
HEIGHT-5);
sb.append(chars[r]);// 将字符保存到StringBuffer中;
}
// 画干扰线(干扰线的条数是LINES)
for (int i = 1; i <= LINES; i++) {
graphic.setColor(getRandomColor());
//drawLine方法的四个参数分别是设置干扰线的起点和结束点坐标;
graphic.drawLine(ran.nextInt(WIDTH), ran.nextInt(HEIGHT),
ran.nextInt(WIDTH), ran.nextInt(HEIGHT));
}
Map<String, BufferedImage> map = new HashMap<String, BufferedImage>();
//将画好的4个字符放入map中的key中;同时将image图像放到value中;
map.put(sb.toString(), image);
return map;
}
public static Color getRandomColor() {
Random ran = new Random();
Color color = new Color(ran.nextInt(256), ran.nextInt(256),
ran.nextInt(256));
return color;
}
public static InputStream getInputStream(BufferedImage image)
throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bos);
encoder.encode(image);
byte[] imageBts = bos.toByteArray();
InputStream in = new ByteArrayInputStream(imageBts);
return in;
}
}