zoukankan      html  css  js  c++  java
  • 随记生成验证码

    package com.hrm.houfei.utils;
    
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.util.Random;
    
    import javax.imageio.ImageIO;
    import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    public class ValidateCodeServlet extends HttpServlet {
    	// 常量
    	private static final long serialVersionUID = 1L;
    	// 验证码图片的宽度。
    	private int width = 60;
    	// 验证码图片的高度。
    	private int height = 20;
    	// 验证码字符个数
    	private int codeCount = 4;
    	private int x = 0;
    	// 字体高度
    	private int fontHeight;
    	private int codeY;
    
    	char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
    			'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
    			'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
    			'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
    			'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
    	/**
    	 * 构造方法
    	 */
    	public ValidateCodeServlet() {
    		super();
    	}
    
    	/**
    	 * 初始化
    	 */
    	public void init() throws ServletException {
    		// 宽度
    		String strWidth = this.getInitParameter("width");
    		// 高度
    		String strHeight = this.getInitParameter("height");
    		// 字符个数
    		String strCodeCount = this.getInitParameter("codeCount");
    
    		// 将配置的信息转换成数值
    		try {
    			if (strWidth != null && strWidth.length() != 0) {
    				width = Integer.parseInt(strWidth);
    			}
    			if (strHeight != null && strHeight.length() != 0) {
    				height = Integer.parseInt(strHeight);
    			}
    			if (strCodeCount != null && strCodeCount.length() != 0) {
    				codeCount = Integer.parseInt(strCodeCount);
    			}
    		} catch (NumberFormatException e) {
    		}
    
    		x = width / (codeCount + 2);
    		fontHeight = height - 1;
    		codeY = height - 4;
    
    	}
    
    	/**
    	 * 服务
    	 */
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		doPost(request, response);
    	}
    
    	/**
    	 * 服务
    	 */
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		// 定义图像buffer
    		BufferedImage buffImg = new BufferedImage(width, height,
    				BufferedImage.TYPE_INT_RGB);
    		Graphics2D g = buffImg.createGraphics();
    
    		// 创建一个随机数生成器类
    		Random random = new Random();
    
    		// 将图像填充为白色
    		g.setColor(Color.WHITE);
    		g.fillRect(0, 0, width, height);
    
    		// 创建字体,字体的大小应该根据图片的高度来定。
    		Font font = new Font("宋体", Font.BOLD, fontHeight);
    		// 设置字体。
    		g.setFont(font);
    
    		// 画边框。
    		g.setColor(Color.GRAY);
    		g.drawRect(0, 0, width - 1, height - 1);
    
    		// 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到。
    		g.setColor(Color.GRAY);
    		for (int i = 0; i < 40; i++) {
    			int x = random.nextInt(width);
    			int y = random.nextInt(height);
    			int xl = random.nextInt(2);
    			int yl = random.nextInt(2);
    			g.drawLine(x, y, x + xl, y + yl);
    		}
    
    		// randomCode用于保存随机产生的验证码,以便用户登录后进行验证。
    		StringBuffer randomCode = new StringBuffer();
    		int red = 0, green = 0, blue = 0;
    
    		// 随机产生codeCount数字的验证码。
    		for (int i = 0; i < codeCount; i++) {
    			// 得到随机产生的验证码数字。
    			String strRand = String.valueOf(codeSequence[random.nextInt(62)]);
    			// 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。
    			red = random.nextInt(127);
    			green = random.nextInt(127);
    			blue = random.nextInt(127);
    
    			// 用随机产生的颜色将验证码绘制到图像中。
    			g.setColor(new Color(red, green, blue));
    			g.drawString(strRand, (i + 1) * x, codeY);
    
    			// 将产生的四个随机数组合在一起。
    			randomCode.append(strRand);
    		}
    		// 将四位数字的验证码保存到Session中。
    		request.getSession().setAttribute("validateCode", randomCode.toString());
    		System.out.println("----------------------->动态生成了验证码:"+randomCode.toString());
    		//session.setAttribute("validateCode", randomCode.toString());
    
    		// 禁止图像缓存。
    		response.setHeader("Pragma", "no-cache");
    		response.setHeader("Cache-Control", "no-cache");
    		response.setDateHeader("Expires", 0);
    
    		response.setContentType("image/jpeg");
    
    		// 将图像输出到Servlet输出流中。
    		ServletOutputStream sos = response.getOutputStream();
    		ImageIO.write(buffImg, "jpeg", sos);
    		sos.flush();
    		sos.close();
    	}
    
    	/**
    	 * 销毁
    	 */
    	public void destroy() {
    		super.destroy();
    	}
    
    }
    
     
  • 相关阅读:
    codechef FNCS
    bzoj2653 middle
    CF698F Coprime Permutation
    CF538H Summer Dichotomy
    CF930E Coins Exhibition
    CF468D Tree
    CF528E Triangles3000
    BZOJ 4066: 简单题
    BZOJ 4300: 绝世好题
    BZOJ 4520: [Cqoi2016]K远点对
  • 原文地址:https://www.cnblogs.com/qq1988627/p/6606878.html
Copyright © 2011-2022 走看看