1.創建驗證碼工具類
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/**
* createImage方法返回一個Map類型,Map的key是所生產的驗證碼的字符串 Map的value是所生產的BufferImage類型的驗證碼
* getInputStream方法將BufferImage轉成InputStream類型
*/
public class ValidateCode {
private static final char[] chars = { '0', '1', '2', '3', '4', '5', '6',
'7', '8', '9', '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', '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' };
private static final int SIZE = 4; // 字符數
private static final int LINES = 12; // 干擾線數量
private static final int WIDTH = 150; // 生成的驗證碼圖片的寬度
private static final int HEIGHT = 80; // 生成的驗證碼圖片的長度
private static final int FONT_SIZE = 50; // 字體大小
public static Map<String, BufferedImage> createImage() {
// 用戶保存字符串
StringBuffer sb = new StringBuffer();
// BufferImage類型的驗證碼
BufferedImage image = new BufferedImage(WIDTH, HEIGHT,
BufferedImage.TYPE_INT_RGB);
// 獲得畫筆
Graphics g = image.getGraphics();
g.setColor(Color.LIGHT_GRAY); // 設置背景色
g.fillRect(0, 0, WIDTH, HEIGHT);// 將背景色填充到圖片中
Random ran = new Random(); // 獲得一個Random對象
// 畫字符
for (int i = 1; i <= SIZE; i++) {
int r = ran.nextInt(chars.length); // 得到一個隨機的下標, chars
// 是保存着若干字符的char字符
g.setColor(getRandomColor()); // 得到一個隨機的顏色
g.setFont(new Font(null, Font.BOLD + Font.ITALIC, FONT_SIZE)); // 設置字體大小
g.drawString(chars[r] + "", (i - 1) * WIDTH / SIZE,
(int) (HEIGHT * 0.7)); // 畫字符
sb.append(chars[r]);
}
// 畫干擾線
for (int i = 1; i <= LINES; i++) {
g.setColor(getRandomColor()); // 同樣,干擾線也是用隨機的顏色
g.drawLine(ran.nextInt(WIDTH), ran.nextInt(HEIGHT),
ran.nextInt(WIDTH), ran.nextInt(HEIGHT));// 隨機設置干擾線的方向
}
// 將圖片中的字符串保存爲Map對象的key,BufferedImage保存爲value
Map<String, BufferedImage> map = new HashMap<String, BufferedImage>();
map.put(sb.toString(), image);
return map;
}
/**
* 獲得一個隨機的顏色 返回 Color對象
*
* @return
*/
private static Color getRandomColor() {
Random ran = new Random();
Color color = new Color(ran.nextInt(256), ran.nextInt(256),
ran.nextInt(256));
return color;
}
/**
* 將 BufferImage轉成InputStream類型
*
* @param image
* @return
* @throws IOException
*/
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;
}
}
2.創建驗證碼action
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import cn.hr.util.ValidateCode;
/**
* 隨機驗證碼
*/
public class ValidateCodeAction {
private InputStream imageStream;
public InputStream getImageStream() {
return imageStream;
}
public void setImageStream(InputStream imageStream) {
this.imageStream = imageStream;
}
public String execute() throws IOException {
Map<String, BufferedImage> map = ValidateCode.createImage();
String key = map.keySet().iterator().next();
BufferedImage image = map.get(key);
imageStream = ValidateCode.getInputStream(image);
return "success";
}
}
3.配置struts.xml
<package name="validateCode" extends="struts-default" namespace="/">
<action name="image" class="完全限定名">
<!--
若是S2SH集成版,完全限定名要改爲相應bean的id屬性的值
inputName是固定寫法, 目的是給這種類型的Result對象的inputName屬性賦值.
imageStream是Action裏的輸出屬性名, 這個輸出屬性是InputStream類型的
-->
<result type="stream">
<param name="inputName">imageStream</param>
</result>
</action>
</package>