package Action;
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.io.OutputStream;
import java.io.PrintWriter;
import java.util.Map;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionSupport;
public class yzm extends ActionSupport implements SessionAware{
private static final int width = 100;
private static final int height = 25;
private String contentType;
private InputStream inputStream;
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
public InputStream getInputStream() {
return inputStream;
}
public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
contentType = "image/jpeg";
BufferedImage bufferedImage = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics g = bufferedImage.getGraphics();
// 设置边框
setBorder(g);
// 设置随机字符
setRandomString(g);
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "jpg", arrayOutputStream);
byte[] buf = arrayOutputStream.toByteArray();
ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(buf);
inputStream = (InputStream)arrayInputStream;
return super.execute();
}
private void setRandomString(Graphics g) {
// TODO Auto-generated method stub
final char[] ch = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' };
String str = "";
for (int i = 0; i < 4; i++) {
str += ch[new Random().nextInt(7)];
}
session.put("yzm", str);
g.setColor(Color.yellow);
g.setFont(new Font("宋体", Font.BOLD, 20));
g.drawString(str, 30, 15);
}
private void setBorder(Graphics g) {
// TODO Auto-generated method stub
g.setColor(Color.BLACK);
g.drawRect(0, 0, width - 1, height - 1);
}
private Map
session;
@Override
public void setSession(Map
arg0) {
// TODO Auto-generated method stub
this.session = arg0;
}
}
下面附上相应的xml配置文件
<span style="font-size:24px;"><strong><action name="yzm" class="Action.yzm">
<result type="stream"></result>
</action></strong></span>
实现原理就是Struts2文件下载的原理,把访问形式改为图片访问,然后关键在流的转换,可以看代码!