`
greenwen
  • 浏览: 220449 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

图形验证码的生成

    博客分类:
  • java
阅读更多
/*
 * 功能说明:生成验证码图片,将验证码保存进session里
 * 参数说明:
 *         count:验证码的字符个数
 *         width:验证码图片宽度
 *         height:验证码图片高度
 *         type:类型 0-纯数字 1-纯大写字母 2-数字和大学字母混合
 */
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.imageio.ImageIO;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ValidationCodeServlet extends HttpServlet {
   
	private static final long serialVersionUID = 6777280022666782466L;

	private final int TYPE_NUMBER = 0;

    private final int TYPE_LETTER = 1;

    private final int TYPE_MULTIPLE = 2;

    private int width;

    private int height;

    private int count;

    private int type;

    private String validate_code;

    private Random random;

    private Font font;

    private int line;

    @Override
    public void init(ServletConfig config) throws ServletException {
	super.init(config);
	width = 56;
	height = 22;
	count = 4;
	type = TYPE_NUMBER;
	random = new Random();
	line = 200;
    }

    @Override
    protected void doGet(HttpServletRequest request,
	    HttpServletResponse response) throws ServletException, IOException {
	response.setHeader("Pragma", "No-cache");
	response.setHeader("Cache-Control", "no-cache");
	response.setDateHeader("Expires", 0);
	response.setContentType("image.jpeg");

	String reqCount = request.getParameter("count");
	String reqWidth = request.getParameter("width");
	String reqHeight = request.getParameter("height");
	String reqType = request.getParameter("type");

	if (reqCount != null && reqCount != "")
	    this.count = Integer.parseInt(reqCount);
	if (reqWidth != null && reqWidth != "")
	    this.width = Integer.parseInt(reqWidth);
	if (reqHeight != null && reqHeight != "")
	    this.height = Integer.parseInt(reqHeight);
	if (reqType != null && reqType != "")
	    this.type = Integer.parseInt(reqType);

	font = new Font("Courier New", Font.BOLD, width / count);

	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(getRandColor(160, 200));
	for (int i = 0; i < line; 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);
	}

	g.setFont(font);
	validate_code = getValidateCode(count, type);
	request.getSession().setAttribute("validate_code", validate_code);
	for (int i = 0; i < count; i++) {
	    g.setColor(new Color(20 + random.nextInt(110), 20 + random
		    .nextInt(110), 20 + random.nextInt(110)));
	    int x = (width / count) * i;
	    int y = ((height + font.getSize()) / 2) - 5;
	    g.drawString(String.valueOf(validate_code.charAt(i)), x, y);
	}

	g.dispose();
	ImageIO.write(image, "JPEG", response.getOutputStream());
    }

    @Override
    protected void doPost(HttpServletRequest request,
	    HttpServletResponse response) throws ServletException, IOException {
	doGet(request, response);
    }

    private Color getRandColor(int from, int to) {
	Random random = new Random();
	if (to > 255)
	    from = 255;
	if (to > 255)
	    to = 255;
	int rang = Math.abs(to - from);
	int r = from + random.nextInt(rang);
	int g = from + random.nextInt(rang);
	int b = from + random.nextInt(rang);
	return new Color(r, g, b);
    }

    private String getValidateCode(int size, int type) {
	StringBuffer validate_code = new StringBuffer();
	for (int i = 0; i < size; i++) {
	    validate_code.append(getOneChar(type));
	}
	return validate_code.toString();
    }

    private String getOneChar(int type) {
	String result = null;
	switch (type) {
	case TYPE_NUMBER:
	    result = String.valueOf(random.nextInt(10));
	    break;

	case TYPE_LETTER:
	    result = String.valueOf((char) (random.nextInt(26) + 65));
	    break;

	case TYPE_MULTIPLE:
	    if (random.nextBoolean()) {
		result = String.valueOf(random.nextInt(10));
	    } else {
		result = String.valueOf((char) (random.nextInt(26) + 65));
	    }
	    break;
	default:
	    result = null;
	    break;
	}
	if (result == null)
	    throw new NullPointerException("获取验证码出错");
	return result;
    }
}
分享到:
评论

相关推荐

    图形验证码生成合集

    这个压缩包文件“图形验证码生成合集”集合了多种类型的Java实现的验证码生成器,包括数字计算验证码、中文验证码、简单验证码以及复杂条纹验证码,这些都为开发者提供了丰富的选择来增强网站或应用的安全性。...

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

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

    (源码)基于SpringBoot的图形验证码生成系统.zip

    # 基于Spring Boot的图形验证码生成系统 ## 项目简介 本项目是一个基于Spring Boot框架的图形验证码生成系统,支持生成多种类型的验证码,包括静态图片验证码、GIF动画验证码、中文验证码和算术验证码。验证码可以...

    【Python】图形验证码生成

    本教程将深入探讨如何使用Python来实现图形验证码的生成。 一、Python与图形验证码 Python作为一种功能强大的编程语言,因其简洁的语法和丰富的...希望这个教程对您在理解和实现Python图形验证码生成过程中有所帮助。

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

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

    asp.net生成图形验证码

    本项目提供的"图形验证码生成_asp.net"文件可能包含了以下关键知识点: 1. **验证码生成算法**:首先,我们需要一个算法来生成随机的验证码字符串。这通常涉及到随机数生成器,选择字母、数字的组合,并确保一定的...

    c#生成图形验证码 一图片的形式生成验证码

    在C#编程语言中,我们可以创建自己的图形验证码生成器。下面我们将详细探讨如何用C#来实现这一功能。 首先,我们需要引入必要的库。在C#中,我们通常会使用System.Drawing命名空间,因为它包含了创建和操作图像所需...

    图形验证码成功之后实现用户登录功能.zip

    1. 设计图形验证码生成器:创建一个算法或使用现成库来生成随机的、难以被机器识别的验证码图片。 2. 验证用户输入:将用户输入与服务器端保存的原始验证码进行比对,确认一致后进入下一步。 3. 发送短信:通过集成...

    Vb图形验证码生成及判断程序

     本程序通过VB编写实现验证码生成,并根据用户的输入判断验证码是否相同,程序实现思路大致是这样的:初始化随机种子,生成随机校验码,显示校验码,添加噪点(防止自动图像识别),设置画点随机位置,设置画点随机...

    Android生成随机的图形验证码

    总的来说,理解和实现Android中的随机图形验证码生成,不仅涉及基本的绘图操作,还涉及到颜色、随机数生成等数学知识,以及Android UI组件和内存管理的理解。熟练掌握这一技能对于提高应用的安全性至关重要。

    js图形验证码,只要简单的复制粘贴 3步

    #### 二、图形验证码生成流程 ##### 1. JSP后端图形验证码生成 在给定的`image.jsp`文件中,我们看到了图形验证码的核心生成逻辑。此段代码通过以下步骤创建了一个随机的图形验证码: - 设置响应头以禁止浏览器...

    vue插件——使用canvas生成图形验证码

    总结一下,这个“vue插件——使用canvas生成图形验证码”结合了Vue.js的组件化和canvas的图形绘制能力,为Web应用提供了一种安全、可定制的图形验证码解决方案。它既保证了用户验证的安全性,又利用Vue.js的便利性...

    java生成随机加减法的图形验证码

    本话题主要关注如何使用Java生成包含随机加减法问题的图形验证码。这种验证码不仅增加了安全性,还为用户提供了验证他们是否为人类的互动方式。 首先,`IdentifyingCode.java`可能是一个类,它代表验证码对象,包含...

    beego框架图形验证码实现

    【beego框架图形验证码实现】是使用Go语言开发的一个高效且功能丰富的图形验证码库,它为Web应用提供了安全的验证码生成服务。这个库的核心目的是为了防止自动化程序(如机器人)进行非法操作,如批量注册、恶意登录...

    java图形验证码生成工具类 web页面校验验证码

    Java图形验证码生成工具类是用于在Web页面上创建安全的随机验证码图像的程序。验证码的主要目的是防止自动机器人或恶意软件进行非法操作,如批量注册、恶意登录等。它通过要求用户输入显示在图像中的随机字符序列来...

    Android生成图形验证码

    在Android平台上,生成图形验证码(CAPTCHA)是提高应用程序安全性的关键步骤,特别是在用户登录或注册过程中。图形验证码的主要目的是防止自动化的机器人程序或者恶意攻击者进行非法操作,如批量注册、恶意登录等。...

    图形验证码.rar

    10. **实战应用**:你可以通过创建一个简单的Web服务来实践这些概念,使用Flask或Django等Web框架,结合上述的图形验证码生成代码,创建一个能够显示并验证图形验证码的页面。 以上就是关于使用Python实现图形...

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

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

    c#生成图形验证码类

    c#编写的生成图形验证码的类,支持算式验证码和字符验证码。使用时先实例化类,就可以直接调用Image属性获得验证码图形,Text属性是验证码的文本,如果使用的是算式验证码,可以调用类的getCodeValue方法获取验证码...

Global site tag (gtag.js) - Google Analytics