packagecom.fpc;importjava.awt.Color;importjava.awt.Font;importjava.awt.Graphics;importjava.awt.Graphics2D;importjava.awt.image.BufferedImage;importjava.io.IOException;importjava.util.Random;importjavax.imageio.ImageIO;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;public class BufferImage extendsHttpServlet {public static final int WIDTH = 120;//生成图片的宽度
public static final int HEIGHT = 30;//生成图片的高度
public static final int WORDS_NUMBER = 5;//验证码中字符的个数
@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throwsServletException, IOException {//TODO Auto-generated method stub
this.doPost(req, resp);
}
@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throwsServletException, IOException {//TODO Auto-generated method stub
String createTypeFlag = req.getParameter("createTypeFlag");//接收客户端传递的createTypeFlag标识//在内存中创建一张图片
BufferedImage bi = newBufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_3BYTE_BGR);//得到图片
Graphics g =bi.getGraphics();//设置图片的背景色
setBackGround(g);//设置图片的边框
setBorder(g);//在图片上画干扰线
drawRandomLine(g);//在图片上放上随机字符
String randomString = this.drawRandomNum((Graphics2D)g, createTypeFlag);//将随机数存在session中
req.getSession().setAttribute("checkcode", randomString);//设置响应头通知浏览器以图片的形式打开
resp.setContentType("image/jpeg");//设置响应头控制浏览器不要缓存
resp.setDateHeader("expries", -1);
resp.setHeader("Cache-Control", "no-cache");
resp.setHeader("Pragma", "no-cache");//将图片传给浏览器
ImageIO.write(bi, "jpg", resp.getOutputStream());
}//设置图片背景色//@param g
private voidsetBackGround(Graphics g) {//设置颜色
g.setColor(Color.WHITE);//填充区域
g.fillRect(0, 0, WIDTH, HEIGHT);
}/** 设置图片的边框
* @param g
**/
private voidsetBorder(Graphics g) {//设置边框颜色
g.setColor(Color.BLUE);//边框区域
g.drawRect(1, 1, WIDTH - 2, HEIGHT -2);
}/** 在图片上画随机线条
* @param g
**/
private voiddrawRandomLine(Graphics g) {//设置颜色
g.setColor(Color.GREEN);//设置线条个数并画线
for ( int i = 0 ; i < 3 ; i++) {int x1 = newRandom().nextInt(WIDTH);int y1 = newRandom().nextInt(HEIGHT);int x2 = newRandom().nextInt(WIDTH);int y2 = newRandom().nextInt(HEIGHT);
g.drawLine(x1, y1, x2, y2);
}
}/** 在图片上画随机字符
* @param g
* @param createTypeFlag
* @return String
**/
privateString drawRandomNum(Graphics g,String createTypeFlag) {//设置颜色
g.setColor(Color.RED);
g.setFont(new Font("宋体",Font.BOLD,20));//数字字母的组合
String baseNumLetter = "0123456789ABCDEFGHJKLMNOPQRSTUVWXYZ";
String baseNum= "0123456789";
String baseLetter= "ABCDEFGHJKLMNOPQRSTUVWXYZ";if ( createTypeFlag != null && createTypeFlag.length() > 0) {if( createTypeFlag.equals("nl") ) {//截取数字和字母的组合
returncreateRandomChar((Graphics2D) g,baseNumLetter);
}else if ( createTypeFlag.equals("n") ) {//截取数字的组合
returncreateRandomChar((Graphics2D) g,baseNum);
}else if ( createTypeFlag.equals("l") ) {//截取字母的组合
returncreateRandomChar((Graphics2D) g,baseLetter);
}
}else{//截取数字和字母的组合
returncreateRandomChar((Graphics2D) g,baseNumLetter);
}return "";
}/** 创建随机字符
* @param g
* @param baseChar
* @return String
**/
privateString createRandomChar(Graphics2D g , String baseChar) {
StringBuffer b= newStringBuffer();int x = 5;
String ch= "";for ( int i = 0 ; i < WORDS_NUMBER ; i++) {//设置字体的旋转角度
int degree = new Random().nextInt() % 30;
ch= baseChar.charAt(new Random().nextInt(baseChar.length())) + "";
b.append(ch);//正向角度
g.rotate(degree * Math.PI / 180 , x,20);
g.drawString(ch, x,20);//反向角度
g.rotate(-degree * Math.PI / 180 , x,20);
x+=30;
}returnb.toString();
}
}