import java.awt.Color; |
import java.awt.Font; |
import java.awt.Graphics; |
import java.awt.image.BufferedImage; |
import java.io.IOException; |
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; |
/** |
* 生成图形验证码的Servlet |
*/ |
public class ImageCodeMakerServlet extends HttpServlet { |
public void doGet(HttpServletRequest req, HttpServletResponse resp) |
throws ServletException, IOException { |
doPost(req, resp); |
} |
/** |
* @see javax.servlet.http.HttpServlet#void |
* (javax.servlet.http.HttpServletRequest, |
* javax.servlet.http.HttpServletResponse) |
*/ |
public void doPost(HttpServletRequest req, HttpServletResponse resp) |
throws ServletException, IOException { |
// 首先设置页面不缓存 |
resp.setHeader( "Pragma" , "No-cache" ); |
resp.setHeader( "Cache-Control" , "no-cache" ); |
resp.setDateHeader( "Expires" , 0 ); |
// 定义图片的宽度和高度 |
int width = 90 , height = 40 ; |
// 创建一个图像对象 |
BufferedImage image = new BufferedImage(width, height, |
BufferedImage.TYPE_INT_RGB); |
// 得到图像的环境对象 |
Graphics g = image.createGraphics(); |
Random random = new Random(); |
// 用随机颜色填充图像背景 |
g.setColor(getRandColor( 180 , 250 )); |
g.fillRect( 0 , 0 , width, height); |
for ( int i = 0 ; i < 5 ; i++) { |
g.setColor(getRandColor( 50 , 100 )); |
int x = random.nextInt(width); |
int y = random.nextInt(height); |
g.drawOval(x, y, 4 , 4 ); |
} |
// 设置字体,下面准备画随机数 |
g.setFont( new Font( "" , Font.PLAIN, 40 )); |
// 随机数字符串 |
String sRand = "" ; |
for ( int i = 0 ; i < 4 ; i++) { |
// 生成四个数字字符 |
String rand = String.valueOf(random.nextInt( 10 )); |
sRand += rand; |
// 生成随机颜色 |
g.setColor( new Color( 20 + random.nextInt( 80 ), 20 + random |
.nextInt( 100 ), 20 + random.nextInt( 90 ))); |
// 将随机数字画在图像上 |
g.drawString(rand, ( 17 + random.nextInt( 3 )) * i + 8 , 34 ); |
// 生成干扰线 |
for ( int k = 0 ; k < 12 ; k++) { |
int x = random.nextInt(width); |
int y = random.nextInt(height); |
int xl = random.nextInt( 9 ); |
int yl = random.nextInt( 9 ); |
g.drawLine(x, y, x + xl, y + yl); |
} |
} |
// 将生成的随机数字字符串写入Session |
req.getSession().setAttribute( "randcode" , sRand); |
// 使图像生效 |
g.dispose(); |
// 输出图像到页面 |
ImageIO.write(image, "JPEG" , resp.getOutputStream()); |
} |
/** |
* 产生一个随机的颜色 |
* |
* @param fc |
* 颜色分量最小值 |
* @param bc |
* 颜色分量最大值 |
* @return |
*/ |
public Color getRandColor( int fc, int bc) { |
Random random = new Random(); |
if (fc > 255 ) { |
fc = 255 ; |
} |
if (bc > 255 ) { |
bc = 255 ; |
} |
int r = fc + random.nextInt(bc - fc); |
int g = fc + random.nextInt(bc - fc); |
int b = fc + random.nextInt(bc - fc); |
return new Color(r, g, b); |
} |
} |