一个简单的随机验证码生成程序

    封装了一个简单的随机生成验证码的类,为以后做自己的网站做准备。做了一个demo,需要的同学可以拿去用。
package xyz.jison.verificationcode.service;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;

import xyz.jison.verificationcode.model.VerificationCodeModel;

/**
 * 生成图形验证码
 * @author jison
 * @since 2015-8-13
 * @version 1.0
 *
 */
public class VerificationCode {

	public VerificationCode(VerificationCodeModel model){
		this.model = model;
	}
	
	/**
	 * 验证码的model
	 */
	private VerificationCodeModel model;
	
	/**
	 * 记录验证码的字符串形式
	 */
	private StringBuffer verificationCodeStr = new StringBuffer();
	
	/**
	 * 记录验证码的图片形式
	 */
	private BufferedImage verificationCodeImage;
	
	/**
	 * 根据以下顺序绘制验证码,边框--》验证码--》干扰线,后绘制的覆盖先绘制的
	 * @return
	 */
	public VerificationCode generateVerifitionCode(){
		verificationCodeImage = new BufferedImage(model.getWidth(), model.getHeight(), BufferedImage.TYPE_INT_RGB);
		Graphics g = verificationCodeImage.getGraphics();
		paintBorder(g);
		paintVerificationCode(g);
		paintInterferingLine(g);
		return this;
	}

	/**
	 * 绘制验证码干扰线
	 * @param g
	 */
	private void paintInterferingLine(Graphics g){
		Random random = new Random();
		for (int i = 0; i < model.getInterferingLineNum(); i++) {
			g.setColor(getRandomColor());
			g.drawLine(random.nextInt(model.getWidth()), 
					random.nextInt(model.getHeight()), 
					random.nextInt(model.getWidth()), 
					random.nextInt(model.getHeight()));
		}
	}
	
	/**
	 * 绘制验证码
	 * @param g
	 */
	private void paintVerificationCode(Graphics g){
		Random random = new Random();
		g.setFont(model.getFont());
		for (int i = 0; i < model.getVerificationCodeNum(); i++) {
			g.setColor(getRandomColor());
			int codeLocate = random.nextInt(model.getVerificationCodeScope());
			String paintStr = model.getMetadata().substring(codeLocate, codeLocate+1);
			g.drawString(paintStr,
					model.getPaddingLeft() + model.getBeginPaintX()*i, 
					model.getBeginPaintY());
			// 记录验证码中的字符
			verificationCodeStr.append(paintStr);
		}
	}
	
	/**
	 * 绘制边框
	 * @param g
	 */
	private void paintBorder(Graphics g){
		g.setColor(model.getBorderColor());
		g.fillRect(0, 0, model.getWidth(), model.getHeight());
		g.setColor(model.getBackgroundColor());
		int borderSize = model.getBorderSize();
		g.fillRect(borderSize, borderSize, model.getWidth() - (borderSize<<1), model.getHeight() - (borderSize<<1));
	}
	
	/**
	 * 
	 * @return Color 随机生成RGB颜色
	 */
	private Color getRandomColor(){
		Random random = new Random();
		Color color = new Color(random.nextInt(model.getColorScope()), 
				random.nextInt(model.getColorScope()), 
				random.nextInt(model.getColorScope()));
		return color;
	}

	public StringBuffer getVerificationCodeStr() {
		return verificationCodeStr;
	}

	public BufferedImage getVerificationCodeImage() {
		return verificationCodeImage;
	}

}


package xyz.jison.verificationcode.model;

import java.awt.Color;
import java.awt.Font;
import java.io.Serializable;

/**
 * 验证码相关的属性
 * @author jison
 * @since 2015-8-13
 * @version 1.0
 *
 */
public class VerificationCodeModel implements Serializable{

	private static final long serialVersionUID = 1L;

	/**
	 * 验证码的元数据,默认为所有字母大小写加数字
	 */
	private String metadata = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
	
	/**
	 * 验证码的随机数取值范围,验证码元数据的长度
	 */
	private int verificationCodeScope = metadata.length();
	
	/**
	 * 验证码的位数,默认为4位数
	 */
	private int verificationCodeNum = 4;

	/**
	 * 验证码的干扰线的条数,默认为10条
	 */
	private int interferingLineNum = 10;
	
	/**
	 * 验证码图片的宽度,默认为80px
	 */
	private int width = 80;
	
	/**
	 * 验证码图片的高度,默认为40px;
	 */
	private int height = 40;
	
	/**
	 * 验证码的字体,默认为宋体,粗体,30px
	 */
	private Font font = new Font("宋体", Font.BOLD, 30);
	
	/**
	 * 颜色的随机数取值范围,默认为255
	 */
	private int colorScope = 255;
	
	/**
	 * 边框颜色,默认为黑色
	 */
	private Color borderColor = Color.BLACK;

	/**
	 * 背景颜色,默认为白色
	 */
	private Color backgroundColor = Color.WHITE;
	
	/**
	 * 边框大小,默认为1
	 */
	private int borderSize = 1;
	
	/**
	 * 验证码的左边距,默认为0
	 */
	private int paddingLeft = 0;
	
	/**
	 * 起始绘制验证码的X坐标,默认为20
	 */
	private int beginPaintX = 20;
	
	/**
	 * 起始绘制验证码的Y坐标,默认为30
	 */
	private int beginPaintY = 30;
	
	public String getMetadata() {
		return metadata;
	}

	public void setMetadata(String metadata) {
		this.metadata = metadata;
	}

	public int getVerificationCodeScope() {
		return verificationCodeScope;
	}

	public void setVerificationCodeScope(int verificationCodeScope) {
		this.verificationCodeScope = verificationCodeScope;
	}

	public int getVerificationCodeNum() {
		return verificationCodeNum;
	}

	public void setVerificationCodeNum(int verificationCodeNum) {
		this.verificationCodeNum = verificationCodeNum;
	}

	public int getInterferingLineNum() {
		return interferingLineNum;
	}

	public void setInterferingLineNum(int interferingLineNum) {
		this.interferingLineNum = interferingLineNum;
	}

	public int getWidth() {
		return width;
	}

	public void setWidth(int width) {
		this.width = width;
	}

	public int getHeight() {
		return height;
	}

	public void setHeight(int height) {
		this.height = height;
	}

	public Font getFont() {
		return font;
	}

	public void setFont(Font font) {
		this.font = font;
	}

	public int getColorScope() {
		return colorScope;
	}

	public void setColorScope(int colorScope) {
		this.colorScope = colorScope;
	}

	public Color getBorderColor() {
		return borderColor;
	}

	public void setBorderColor(Color borderColor) {
		this.borderColor = borderColor;
	}

	public Color getBackgroundColor() {
		return backgroundColor;
	}

	public void setBackgroundColor(Color backgroundColor) {
		this.backgroundColor = backgroundColor;
	}

	public int getBorderSize() {
		return borderSize;
	}

	public void setBorderSize(int borderSize) {
		this.borderSize = borderSize;
	}

	public int getPaddingLeft() {
		return paddingLeft;
	}

	public void setPaddingLeft(int paddingLeft) {
		this.paddingLeft = paddingLeft;
	}

	public int getBeginPaintX() {
		return beginPaintX;
	}

	public void setBeginPaintX(int beginPaintX) {
		this.beginPaintX = beginPaintX;
	}

	public int getBeginPaintY() {
		return beginPaintY;
	}

	public void setBeginPaintY(int beginPaintY) {
		this.beginPaintY = beginPaintY;
	}
	
}


package xyz.jison.verificationcode.servlet;

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;

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 xyz.jison.verificationcode.model.VerificationCodeModel;
import xyz.jison.verificationcode.service.VerificationCode;

/**
 * 生成验证码的Servlet
 * @author jison
 * @since 2015-8-13
 * @version 1.0
 *
 */
@WebServlet(urlPatterns="/verificationCodeServlet")
public class VerificationCodeServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		this.doPost(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("image/jpeg");
		OutputStream outputStream = resp.getOutputStream();
		VerificationCode verificationCode = new VerificationCode(new VerificationCodeModel());
		verificationCode = verificationCode.generateVerifitionCode();
		BufferedImage verificationCodeImage = verificationCode.getVerificationCodeImage();
		String verificationCodeStr = verificationCode.getVerificationCodeStr().toString();
		req.getSession().setAttribute("verificationCodeStr", verificationCodeStr);
		ImageIO.write(verificationCodeImage, "jpg", outputStream);
	}

	
}


package xyz.jison.verificationcode.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 验证验证码是否正确Servlet
 * @author jison
 * @since 2015-8-13
 * @version 1.0
 *
 */
@WebServlet(urlPatterns="/validateServlet")
public class ValidateServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		this.doPost(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String verificationCodeStr = (String)req.getSession().getAttribute("verificationCodeStr");
		String userInputCode = req.getParameter("userInputCode");
		resp.setContentType("text/html;charset=utf-8");
		PrintWriter out = resp.getWriter();
		if(verificationCodeStr!=null){
			if(userInputCode.equalsIgnoreCase(verificationCodeStr)){
				out.append("验证通过!");
			} else {
				out.append("验证码错误!");
			}
			req.getSession().removeAttribute("verificationCodeStr");
		}else {
			out.append("验证码失效!");
		}
	}
}


<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>验证码</title>
<script type="text/javascript">
	var xmlhttp=null;
	function updateCode(){
		if (window.XMLHttpRequest)
		{// code for IE7, Firefox, Opera, etc.
			xmlhttp=new XMLHttpRequest();
		}
		else if (window.ActiveXObject)
		{// code for IE6, IE5
			xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
		}
		if (xmlhttp!=null)
		{
			xmlhttp.onreadystatechange=function(){
				if (xmlhttp.readyState==4)
				  {// 4 = "loaded"
			 	  if (xmlhttp.status==200)
			 	    {// 200 = "OK"
						document.getElementById("code").src = "verificationCodeServlet?" + new Date();
			 	    }
			 	  else
			 	    {
			 	    alert("验证码刷新失败:" + xmlhttp.statusText);
			 	    }
				  }
			}
			xmlhttp.open("POST", "verificationCodeServlet" , true);
			xmlhttp.send(null);
		}
		else
		{
		alert("浏览器不支持ajax!");
		}
	}
</script>
</head>
<body>
	<form action="validateServlet" method="post">
		<input name="userInputCode" type="text" /> 
		<img id="code" src="verificationCodeServlet" /> 
		[url=#]看不清,换一张[/url]<br/>
		<input type="submit" value="验证" />
	</form>
</body>
</html>

猜你喜欢

转载自jisonami.iteye.com/blog/2235503