jsp 生成网页验证码的Servlet详解编程语言

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); 
	} 
} 

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/10332.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论