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.opensymphony.xwork2.ActionContext;
import com.sun.image.codec.jpeg.ImageFormatException;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import com.zkyc.action.user.BaseAction;
public class ImageUtil extends BaseAction{ //BaseAction为自定义的一个类该类得到request、response
//application 等对象
private InputStream inn;
public String execute(){
byte[] b=null;
ByteArrayOutputStream os = new ByteArrayOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(os);
Map<String, BufferedImage> map=getImage();
String code=(String)session.get("code");
BufferedImage image=map.get(code);
try {
encoder.encode(image);
} catch (ImageFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
b=os.toByteArray();
inn= new ByteArrayInputStream(b);
return "ok";
}
private static final String[] chars = { "0", "1", "2", "3", "4", "5", "6",
"7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I"};
private static final int SIZE = 4;
private static final int LINES = 20;
private static final int WIDTH = 200;
private static final int HEIGHT = 100;
private static final int FONT_SIZE = 50;
public static Map<String, BufferedImage> getImage() {
StringBuffer sb = new StringBuffer();
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();
//
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 / 2);
sb.append(chars[r]);//
}
ActionContext.getContext().getSession().put("code", sb.toString());
//
for (int i = 1; i <= LINES; i++) {
graphic.setColor(getRandomColor());
graphic.drawLine(ran.nextInt(WIDTH), ran.nextInt(HEIGHT), ran
.nextInt(WIDTH), ran.nextInt(HEIGHT));
}
Map<String, BufferedImage> map = new HashMap<String, BufferedImage>();
map.put(sb.toString(), image);
return map;
}
private static Color getRandomColor() {
Random ran = new Random();
Color color = new Color(ran.nextInt(256), ran.nextInt(256), ran
.nextInt(256));
return color;
}
public InputStream getInn() {
return inn;
}
public void setInn(InputStream inn) {
this.inn = inn;
}
}
2)配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<package name="user" extends="dangd-default" namespace="/user">
<!-- 产生验证码 -->
<!-- inn为产生验证码的类返回的流的名字 -->
<action name="code" class="com.zkyc.util.ImageUtil">
<result name="ok" type="stream">
<param name="inputName">inn</param>
</result>
</action>
</package>
</struts>
3)jsp页面上的配置
<img class="yzm_img" id='imgVcode' src="code.action" <!-- code与配置文件中Action的name属性对应相等 -->
width="100px" />