`

验证码生成

    博客分类:
  • JAVA
阅读更多
package sfca.util;

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.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;

import org.apache.commons.lang.RandomStringUtils;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class VerifyCode extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private int length = 4; // 设置默认生成4个数字

	private int width = 60; // 设置图象宽度

	private int height = 20; // 设置图象高度

	private Font mFont = new Font("Fixedsys", Font.PLAIN, 18); // 设置字体

	/**
	 * Constructor of the object.
	 */
	public VerifyCode() {
		super();
	}

	/**
	 * Destruction of the servlet. <br>
	 */
	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
		// Put your code here
	}

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

	/**
	 * The doGet method of the servlet. <br>
	 * 
	 * This method is called when a form has its tag value method equals to get.
	 * 
	 * @param request
	 *            the request send by the client to the server
	 * @param response
	 *            the response send by the server to the client
	 * @throws ServletException
	 *             if an error occurred
	 * @throws IOException
	 *             if an error occurred
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		HttpSession session = request.getSession(false);
		response.setContentType("image/jpeg"); // 必须设置ContentType为image/jpeg
		// 设置页面不缓存
		response.addHeader("pragma", "NO-cache");
		response.addHeader("Cache-Control", "no-cache");
		response.addDateHeader("Expries", 0);

		String sessionName = Utils.dealNull(request.getParameter("type"));
		sessionName = Utils.htmlEncode(sessionName);
		if (sessionName == null || "".equals(sessionName)) {
			sessionName = "smasungsms";
		}

		// 在内存中创建图象

		BufferedImage image = new BufferedImage(width, height,
				BufferedImage.TYPE_INT_RGB); // 设置图片大小的
		// 获取图形上下文
		Graphics g = image.getGraphics();
		g.setColor(getRandColor(200, 250)); // 设置背景色
		g.fillRect(0, 0, width, height);

		// 设定字体
		g.setColor(Color.black); // 设置字体色
		g.setFont(mFont);

		// 画边框
		// g.setColor(new Color());
		// g.drawRect(0,0,width-1,height-1);

		// 生成随机类
		Random random = new Random();

		// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
		g.setColor(getRandColor(160, 200));
		for (int i = 0; i < 155; i++) {
			int x = random.nextInt(width);
			int y = random.nextInt(height);
			int xl = random.nextInt(12);
			int yl = random.nextInt(12);
			g.drawLine(x, y, x + xl, y + yl);
		}

		// 取随机产生的认证码(4位数字)
		String strRandom = RandomStringUtils.randomAlphanumeric(length)
				.toLowerCase();

		for (int i = 0; i < length; i++) {

			String rand = String.valueOf(strRandom.substring(i, i + 1));

			// 将认证码显示到图象中
			g.setColor(new Color(20 + random.nextInt(110), 20 + random
					.nextInt(110), 20 + random.nextInt(110)));
			// 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
			g.drawString(rand, 13 * i + 6, 16);
		}

		// 将认证码存入SESSION
		if (session == null)
			session = request.getSession(true);
		
		session.setAttribute(sessionName, strRandom);
		 

		// 图象生效
		g.dispose();
		//response.reset();

		// 输出图象到页面
		//ImageIO.write(image, "JPEG", response.getOutputStream());
		ServletOutputStream responseOutputStream = response.getOutputStream();
		JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(responseOutputStream);
		encoder.encode(image);
		
		//关闭流 
		responseOutputStream.flush();
		responseOutputStream.close();
	}

	/**
	 * The doPost method of the servlet. <br>
	 * 
	 * This method is called when a form has its tag value method equals to
	 * post.
	 * 
	 * @param request
	 *            the request send by the client to the server
	 * @param response
	 *            the response send by the server to the client
	 * @throws ServletException
	 *             if an error occurred
	 * @throws IOException
	 *             if an error occurred
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doGet(request, response);
	}

	/**
	 * Initialization of the servlet. <br>
	 * 
	 * @throws ServletException
	 *             if an error occure
	 */
	public void init() throws ServletException {
		// Put your code here
	}

}
 
分享到:
评论

相关推荐

    验证码生成工具类

    验证码生成工具类是一种在Web应用中广泛使用的安全机制,它主要用于防止自动化的恶意操作,比如机器人注册、垃圾邮件发送等。这个工具类是用Java语言编写的,因此我们可以深入探讨一下Java验证码生成的相关技术和...

    验证码生成类大全

    验证码生成类大全是一种用于网络安全验证的重要工具,它主要用于防止恶意自动化程序(如机器人)进行非法操作,例如批量注册、刷票或数据抓取。在Web应用中,验证码通常需要用户在提交表单前输入图像上显示的一串...

    VC++验证码生成Base64验证码png图片程序

    VC++验证码生成Base64验证码png图片程序,如何使用VC++生成验证码图片,输出Base64图片给网页调用

    图片验证码生成demo

    这个"图片验证码生成demo"是一个示例项目,用于演示如何创建这样的验证码系统。在本文中,我们将深入探讨验证码的工作原理,以及如何使用编程技术来实现一个图片验证码生成器。 验证码的主要目标是防止自动化程序...

    验证码生成类-最好用的

    验证码生成类是IT领域中一个重要的安全机制,主要用于防止恶意自动化程序或机器人对网站或应用程序进行非法操作。在本文中,我们将深入探讨验证码生成类的相关知识点,并基于提供的文件信息进行详细解析。 首先,...

    页面验证码生成器

    本项目“页面验证码生成器”提供了一种自定义化的解决方案,允许开发者根据需求调整验证码的字符集、长度、图像尺寸以及干扰纹样式。 在Java中实现验证码生成,通常涉及到以下几个核心知识点: 1. **随机数生成**...

    验证码生成(java)包

    验证码生成在IT行业中是一项重要的安全技术,主要用于防止自动化的机器人程序或者恶意用户进行非法操作,如批量注册、恶意登录等。本压缩包提供了一个基于Java的验证码生成解决方案,包括了必要的库文件,如jcaptcha...

    java验证码生成类

    这篇博客文章“java验证码生成类”提供了一个简单的示例,下面我们将深入探讨验证码生成的相关知识点。 首先,验证码的基本原理是生成一段随机的、难以由机器识别的文字或数字序列,然后要求用户在限定时间内输入这...

    Windows版验证码生成程序

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

    基于Springboot+VUE的谷歌验证码生成器+源代码+文档说明

    基于Springboot+VUE 的前后端分离式谷歌验证码生成器后台代码 ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信...

    安卓验证码相关-android本地验证码生成.rar

    本压缩包"安卓验证码相关-android本地验证码生成.rar"包含了一些关于在Android平台上实现本地验证码生成的源码和资料。下面将详细介绍验证码的原理以及如何在Android中实现。 验证码的原理: 验证码是一种“全自动...

    php高安全验证码生成类

    对于这个验证码生成类,readme.md可能会详细解释如何配置字体目录、如何引入类文件、示例代码以及可能出现的问题和解决方案。 通过以上方法,我们可以构建一个具有较高安全性的PHP验证码生成类,有效防止自动化攻击...

    旋转验证码生成与识别(Python版)

    在网络安全领域,验证码(CAPTCHA)是一种用于验证用户是否为人类的工具,它通常用于防止自动脚本或机器人...同时,这个项目也为你提供了一个实战平台,可以尝试优化现有的验证码生成和识别算法,以应对更复杂的挑战。

    一个php验证码生成类代码.zip

    这个“一个php验证码生成类代码.zip”压缩包中包含了一个PHP验证码生成类,它能够帮助开发者轻松地创建具有背景、干扰元素和随机文本的图像验证码。 验证码类通常包括以下几个核心功能: 1. **生成随机字符串**:...

    表单验证码生成_js

    本篇文章将详细讲解基于JavaScript(js)实现的表单验证码生成技术,以及如何自定义字符并创建高效实例。 验证码的核心功能是生成一组随机的、难以被程序自动识别的字符序列,通常包括字母、数字、甚至图形。...

    dotnet-HeiCaptcha一个netcore跨平台的图形验证码生成工具包

    标题中的"dotnet-HeiCaptcha"是一个专为.NET Core设计的图形验证码生成库,强调了其跨平台的特性。这意味着它不仅能在Windows系统上运行,还能在Linux或macOS等其他支持.NET Core的平台上工作。"HeiCaptcha"这个名字...

    轻量级验证码生成工具

    本篇将详细探讨“轻量级验证码生成工具”——一个基于Java的验证码生成插件。 该插件设计的目标是轻便且易于集成,它内置了四种不同的验证码样式,可以满足各种应用场景的需求。这些样式可能包括不同颜色、字体、...

    C# 如何自动生成验证码(Web图形验证码生成示例),相信好多人有要用哦(源码)

    本文将详细介绍如何使用C#自动生成Web图形验证码,以及提供一个简单的5位数字验证码生成示例。 首先,理解验证码的基本概念:验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and...

    java模仿qq样式验证码生成器

    Java模拟QQ样式验证码生成器是一种基于Java编程语言实现的工具,用于创建类似于QQ应用程序中使用的验证码。QQ验证码通常具有特定的样式,包括扭曲的文字、颜色干扰以及背景元素,旨在增加机器识别的难度,同时保证...

Global site tag (gtag.js) - Google Analytics