`

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

阅读更多
    封装了一个简单的随机生成验证码的类,为以后做自己的网站做准备。做了一个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>
0
1
分享到:
评论

相关推荐

    简单的验证码生成程序

    根据给定的信息,本文将详细解释一个简单的验证码生成程序的核心逻辑与实现方法。该程序主要应用于Web应用中,用于防止机器人的自动填写表单或进行其他自动化操作。 ### 验证码生成程序概述 该程序名为`...

    jsp随机验证码生成测试

    本项目“jsp随机验证码生成测试”提供了一个基于Java Server Pages (JSP) 实现的验证码生成实例,旨在帮助开发者理解和实践如何在Web应用程序中集成验证码功能。 验证码的主要目的是验证用户是人而不是计算机程序。...

    Windows版验证码生成程序

    本程序是采用Windows GDI+技术模拟Web上的验证码生成而设计的一款Windows版验证码随机生成程序,利用GDI+图形图像处理技术,可随机生成强验证码(即汉字验证码)或弱验证码(即数字和字母组合验证码),支持验证码的...

    随机生成验证码工具jar包

    这个“随机生成验证码工具jar包”是一个Java编写的程序库,它能够帮助开发者快速地在他们的应用中集成验证码功能。让我们深入了解一下这个jar包以及与之相关的Java和jar文件的知识。 首先,Java是一个广泛使用的...

    用Python生成随机验证码

    该资源为小编原创的使用Python生成随机验证码的源文件,可供学习制作python验证码的小伙伴们下载

    随机验证码的生成程序

    随机验证码的生成程序是Web开发中常用的一种安全技术,用于防止自动机器人或恶意脚本进行非法操作,如注册、登录、投票等。在ASP.NET框架中,C#语言被广泛用于编写这种验证码生成器。本篇文章将深入探讨验证码的生成...

    python3中图片验证码生成程序

    总的来说,这个Python 3验证码生成程序是一个很好的学习资源,它涵盖了图像处理、随机数生成和字体应用等多个方面的知识。通过理解并实践这个程序,开发者可以更好地掌握Python的图像处理技巧,并了解如何构建安全的...

    java生成的随机验证码

    在Java中,生成随机验证码涉及到多个知识点,包括字符串处理、随机数生成、图像处理以及字体操作等。下面将详细介绍这些内容。 首先,我们要生成随机数字或字母。在Java中,可以使用`java.util.Random`类来生成...

    验证码生成程序,可实现随机生成验证码

    把本页面放入web工程,加入IMAGE,它的imageUrl设成ValidateCode.aspx搞定,可实现随机生成验证码。验证代码:protected void btnLogin_Click(object sender, EventArgs e) { if (Session[ValidateCode....

    asp.net 生成随机验证码

    在ASP.NET中,生成随机验证码是一项...总之,生成随机验证码是ASP.NET开发中的一个重要环节,涉及到字符串随机生成、图形处理和用户交互等多个方面。通过掌握这些技术,我们可以为Web应用程序提供更强大的安全保障。

    PHP语言编写的随机验证码的生成

    在本教程中,我们将探讨如何使用PHP编写一个简单的随机验证码生成器。 首先,我们需要理解验证码生成的基本步骤: 1. **生成随机字符串**:验证码通常由一组随机字符组成,可以是数字、字母或两者的组合。在PHP中...

    验证码的生成,如何随机生成验证码

    - **安全性**:定期更换验证码生成算法,防止攻击者通过分析模式破解。同时,限制同一验证码的使用次数和有效期。 6. **文件名“验证码的识别”可能包含的内容** 这个文件可能是关于验证码识别技术的文档或代码...

    QT实现随机生成验证码

    // 验证码生成 QString generateCode() { QString code; for (int i = 0; i ; ++i) { int index = QRandomGenerator::global()-&gt;generate() % chars.length(); code.append(chars.mid(index, 1)); } return ...

    Python实现随机生成验证码

    1. **生成随机字符串**:我们需要定义一个函数来生成指定长度的随机字符串。可以使用`random.choice()`从字符集中随机选择字符,`string.ascii_letters`包含所有大小写字母,`string.digits`包含数字,我们可以将...

    ASP验证码-非常优秀的ASP随机验证码

    Asp纯数字随机验证码程序 (5.98 kb) Asp数字及字母组合验证码程序(5.98 kb) Asp纯字母验证码程序.zip (5.98 kb GetCode(ASP验证码生成代码) 以上源码:完全免费的传统ASP的VBScript 。 安全码是完全随机的。 ...

    一个小的验证码图片生成程序

    这个"一个小的验证码图片生成程序"是为VC6.0编写的,VC6.0是Microsoft Visual C++ 6.0的简称,是一款经典的Windows平台下的C++集成开发环境。 验证码图片生成程序的核心原理在于创建随机且难以被机器识别的图像。...

    python2中图片验证码生成程序

    在Python 2环境中,你可以使用各种方法来创建自定义的验证码生成程序。这里我们将深入探讨如何利用Python的Pillow库来实现这一功能。 首先,`Pillow`库是Python的一个图像处理库,它是 PIL(Python Imaging Library...

    C#随机验证码随机验证码随机验证码

    在C#编程语言中,实现一个随机验证码功能是相当常见的需求。下面将详细讨论如何在C#中创建随机验证码。 首先,我们需要理解验证码的基本组成部分。验证码通常由一组随机生成的字母、数字或者两者混合组成,有时会带...

Global site tag (gtag.js) - Google Analytics