content: /**
   * Copyright &copy; 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
   */
  package com.jeespring.common.servlet;
  
  import java.awt.Color;
  import java.awt.Font;
  import java.awt.Graphics;
  import java.awt.image.BufferedImage;
  import java.io.IOException;
  import java.io.OutputStream;
  import java.util.Random;
  
  import javax.imageio.ImageIO;
  import javax.servlet.ServletException;
  import javax.servlet.annotation.WebServlet;
  import javax.servlet.http.HttpServlet;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  
  import org.apache.commons.lang3.math.NumberUtils;
  import org.apache.commons.lang3.StringUtils;
  
  /**
   * 生成随机验证码
   * @author 黄炳桂 516821420@qq.com
   * @version 2014-7-27
   */
  @SuppressWarnings("serial")
  @WebServlet(urlPatterns = "/servlet/validateCodeServlet")
  public class ValidateCodeServlet extends HttpServlet {
  	
  	public static final String VALIDATE_CODE = "validateCode";
  	
  	//private int w = 70;
  	//private int h = 26;
  	private int w = 80;
  	private int h = 40;
  
  	public ValidateCodeServlet() {
  		super();
  	}
  	
  	public void destroy() {
  		super.destroy(); 
  	}
  	
  	public static boolean validate(HttpServletRequest request, String validateCode){
  		String code = (String)request.getSession().getAttribute(VALIDATE_CODE);
  		return validateCode.toUpperCase().equals(code); 
  	}
  
  	public void doGet(HttpServletRequest request, HttpServletResponse response)
  			throws ServletException, IOException {
  		String validateCode = request.getParameter(VALIDATE_CODE); // AJAX验证，成功返回true
  		if (StringUtils.isNotBlank(validateCode)){
  			response.getOutputStream().print(validate(request, validateCode)?"true":"false");
  		}else{
  			this.doPost(request, response);
  		}
  	}
  
  	public void doPost(HttpServletRequest request, HttpServletResponse response)
  			throws ServletException, IOException {
  		createImage(request,response);
  	}
  	
  	private void createImage(HttpServletRequest request,
  			HttpServletResponse response) throws IOException {
  		
  		response.setHeader("Pragma", "no-cache");
  		response.setHeader("Cache-Control", "no-cache");
  		response.setDateHeader("Expires", 0);
  		response.setContentType("image/jpeg");
  		
  		/*
  		 * 得到参数高，宽，都为数字时，则使用设置高宽，否则使用默认值
  		 */
  		String width = request.getParameter("width");
  		String height = request.getParameter("height");
  		if (StringUtils.isNumeric(width) && StringUtils.isNumeric(height)) {
  			w = NumberUtils.toInt(width);
  			h = NumberUtils.toInt(height);
  		}
  		
  		BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
  		Graphics g = image.getGraphics();
  
  		/*
  		 * 生成背景
  		 */
  		createBackground(g);
  
  		/*
  		 * 生成字符
  		 */
  		String s = createCharacter(g);
  		createLine(g);
  		request.getSession().setAttribute(VALIDATE_CODE, s);
  
  		g.dispose();
  		OutputStream out = response.getOutputStream();
  		ImageIO.write(image, "JPEG", out);
  		out.close();
  
  	}
  	
  	private Color getRandColor(int fc,int bc) { 
  		int f = fc;
  		int b = bc;
  		Random random=new Random();
          if(f>255) {
          	f=255; 
          }
          if(b>255) {
          	b=255; 
          }
          return new Color(f+random.nextInt(b-f),f+random.nextInt(b-f),f+random.nextInt(b-f)); 
  	}
  	
  	private void createBackground(Graphics g) {
  		// 填充背景
  		//g.setColor(getRandColor(220,250));
  		g.setColor(new Color(255,255,255));
  		g.fillRect(0, 0, w, h);
  		// 加入干扰线条
  		//干扰线条先注释
  		for (int i = 0; i < 20; i++) {
  			/*g.setColor(getRandColor(40,150));
  			Random random = new Random();
  			int x = random.nextInt(w);
  			int y = random.nextInt(h);
  			int x1 = random.nextInt(w);
  			int y1 = random.nextInt(h);
  			g.drawLine(x, y, x1, y1);*/
  		}
  	}
  	private void createLine(Graphics g) {
  		// 加入干扰线条
  		//干扰线条先注释
  		Random randomTimes = new Random();
  		int times=randomTimes.nextInt(25);
  		for (int i = 0; i <times; i++) {
  			//g.setColor(getRandColor(40,150));
  			g.setColor(new Color(255,255,255));
  			Random random = new Random();
  			int x = random.nextInt(w);
  			int y = random.nextInt(h);
  			int x1 = random.nextInt(w);
  			int y1 = random.nextInt(h);
  			g.drawLine(x, y, x1, y1);
  		}
  	}
  	private String createCharacter(Graphics g) {
  		/*char[] codeSeq = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J',
  				'K', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
  				'X', 'Y', 'Z', '2', '3', '4', '5', '6', '7', '8', '9' };*/
  		char[] codeSeq = {'0','1', '2', '3', '4', '5', '6', '7', '8', '9' };
  		//String[] fontTypes = {"Arial","Arial Black","AvantGarde Bk BT","Calibri"};
  		String[] fontTypes = {"Ravie","Antique Olive Compact","Fixedsys","Wide Latin","Gill Sans Ultra Bold"};
  		Random random = new Random();
  		StringBuilder s = new StringBuilder();
  		for (int i = 0; i < 4; i++) {
  			String r = String.valueOf(codeSeq[random.nextInt(codeSeq.length)]);//random.nextInt(10));
  			//g.setColor(new Color(50 + random.nextInt(100), 50 + random.nextInt(100), 50 + random.nextInt(100)));
  			g.setColor(new Color(70, 70, 70));
  			//g.setFont(new Font(fontTypes[random.nextInt(fontTypes.length)],Font.BOLD,26));
  			g.setFont(new Font("Arial",Font.ITALIC,18));
  			//g.drawString(r, 15 * i + 5, 19 + random.nextInt(8));
  			g.drawString(r, 20 * i + 4, 26 );
  			s.append(r);
  		}
  		return s.toString();
  	}
  	
  }
  