`
zyongking
  • 浏览: 58670 次
  • 性别: Icon_minigender_1
  • 来自: 湖北
社区版块
存档分类
最新评论

Java实现验证码

    博客分类:
  • java
阅读更多
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.wind.util;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.geom.Line2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;

/**
 *
 * @author zyong
 * 验证码
 */
public class CheckCode {

    /**
     * 创建一个随机数对象
     */
    Random random = new Random();
    /**
     * 生成的字符集
     */
    private final String character = "0ABC1DEF2GHI3JKL4MNO5PQR6ST7UV8WX9YZ";
    /**
     * 返回生成后的图片字符
     */
    private String checkCode;
    /**
     * 设置生成图片的宽度,默认为65
     */
    private int width = 65;
    /**
     * 设置生成图片的高度,默认为25
     */
    private int height = 25;
    /**
     * 设置图片的类型,默认为BufferedImage.TYPE_INT_RGB
     */
    private int imageType = BufferedImage.TYPE_INT_RGB;

    /**
     *
     * @return 生成图片后的字符
     */
    public String getCheckCode() {
        return checkCode;
    }

    /**
     * 
     * @return 图片的高度
     */
    public int getHeight() {
        return height;
    }

    /**
     *
     * @param height 图片的高度
     */
    public void setHeight(int height) {
        this.height = height;
    }

    /**
     *
     * @return 图片的宽度
     */
    public int getWidth() {
        return width;
    }

    /**
     *
     * @param width 图片的宽度
     */
    public void setWidth(int width) {
        this.width = width;
    }

    /**
     *
     * @return 图片类型
     */
    public int getImageType() {
        return imageType;
    }

    /**
     *
     * @param imageType 图片类型
     */
    public void setImageType(int imageType) {
        this.imageType = imageType;
    }

    /**
     *
     * @return 生成一张图片
     */
    public ByteArrayInputStream buildImage() {

        BufferedImage image = new BufferedImage(this.width, this.height, this.imageType);
        Graphics g = image.getGraphics();
        Graphics2D g2d = (Graphics2D) g;
        g.setColor(this.getColor(200, 250));
        g.fillRect(0, 0, this.width, this.height);
        g.setFont(new Font("Times New Roman", Font.BOLD, 17));
        g.setColor(this.getColor(180, 200));
        /*
         *绘制100条干扰线
         */
        for (int i = 0; i < 100; i++) {
            int x1 = random.nextInt(this.width);
            int y1 = random.nextInt(this.height);
            int x2 = random.nextInt(this.width - 3);
            int y2 = random.nextInt(this.height - 3);
            BasicStroke bs = new BasicStroke(2f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL);
            Line2D line = new Line2D.Double(x1, y1, x2, y2);
            g2d.setStroke(bs);
            g2d.draw(line);
            g.setColor(getColor(180, 222));
        }
        StringBuffer codeStr = new StringBuffer();
        for (int i = 0; i < 4; i++) {
            char c = character.charAt(random.nextInt(36));
            codeStr.append(c);
            Color color = new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110));
            g.setColor(color);
            /*随机文字,旋转文字到指定角度*/
            AffineTransform trans = new AffineTransform();
            trans.rotate(random.nextInt(10) * i + 3, 5);
            float scaleSize = random.nextFloat() + 0.5f;
            if (scaleSize < 0.8 || scaleSize > 1.1f) {
                scaleSize = 1f;
            }
            trans.scale(scaleSize, scaleSize);
            g2d.setTransform(trans);
            g.drawString(String.valueOf(c), 15 * i + 6, 9);
        }
        this.checkCode = codeStr.toString();
        g.dispose();
        ByteArrayInputStream inputStream = null;
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        try {
            ImageOutputStream imgOutput = ImageIO.createImageOutputStream(outputStream);
            ImageIO.write(image, "JPEG", imgOutput);
            imgOutput.close();
            inputStream = new ByteArrayInputStream(outputStream.toByteArray());
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return inputStream;

    }

    /**
     * 利用随机数,随机生成一个Color颜色的对象
     * @param fc
     * @param bc
     * @return 颜色对象
     */
    private Color getColor(int fc, int bc) {
        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);
    }
}

 

分享到:
评论

相关推荐

    JAVA实现验证码(完整代码)

    JAVA 实现验证码(完整代码) JAVA 实现验证码是一种常见的验证机制,用于防止机器人和自动程序的攻击。下面是关于 JAVA 实现验证码的详细知识点: 验证码的概念和作用 验证码是一种challenge-response测试,用于...

    java实现验证码

    在Java中实现验证码涉及到图像处理、随机数生成、字体操作等多个方面的知识。本文将深入探讨如何使用Java来创建一个简单的图形验证码。 首先,我们需要了解验证码的基本原理。验证码通常包含一串随机生成的字符,...

    java实现验证码(只需将文件加入工程,按照步骤就可以融合了)

    验证码是Web应用中常见的一种安全机制,...综上所述,Java实现验证码涉及图像处理、随机数生成、字符串操作以及Web交互等多个方面。通过上述步骤,你可以轻松地将验证码功能集成到自己的Java工程中,提升应用的安全性。

    【JavaWeb】(11)Java实现验证码制作

    【JavaWeb】(11)Java实现验证码制作,三种不同的验证码制作。

    java实现验证码(源码)

    以上就是基于Java实现验证码的一个基本框架。实际应用中,验证码的设计会更复杂,可能包括颜色混淆、噪声线的添加、字体的随机选择、角度偏移等多种增强手段,以提高安全性。同时,为了提升用户体验,验证码的生成...

    Java实现验证码的代码

    Java实现验证码的关键步骤 ###### (1) 创建图像 ```java // 创建 BufferedImage 对象,指定类型为 TYPE_INT_BGR BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR); // 获取 ...

    java实现滑动验证码

    java实现滑动验证码

    Java实现验证码的制作

    以上就是一个简单的Java实现验证码的流程。实际应用中,你可能还需要考虑更多的安全因素,如使用更复杂的扭曲算法、加入时间戳防止重放攻击、添加文本和颜色的多样性等。此外,还可以考虑使用现有的开源验证码库,如...

    java 实现验证码(servlet+jsp)

    以上就是使用Java Servlet和JSP实现验证码的基本步骤。在实际应用中,还需要考虑一些优化措施,如防止重复请求同一验证码、设置验证码过期时间等。这个过程可以通过解压名为`verifyCodeDemo`的压缩包文件来查看具体...

    java实现验证码代码

    在本案例中,我们将探讨如何使用Java语言来实现验证码的生成。Java作为一种广泛使用的编程语言,具有丰富的库和工具支持,使得验证码的实现变得相对简单。 验证码通常由一串随机字符组成,这些字符可以是数字、字母...

    用JAVA实现验证码的绘制

    在Java中实现验证码的绘制涉及多个知识点,包括图形处理、随机数生成、颜色处理等。以下将详细讲解这些知识点。 首先,验证码的基本原理是生成一组随机字符(通常包含字母、数字和特殊字符),并将其以扭曲、倾斜、...

    Java实现验证码验证功能

    本文将深入探讨如何使用Java编程语言来实现验证码验证,主要涉及Servlet、session以及画板对象等关键技术和概念。 首先,验证码(CAPTCHA)全称为“Completely Automated Public Turing test to tell Computers and...

    java实现验证码产生功能

    在Java JSP(Java Server Pages)中实现验证码功能,主要涉及以下几个关键知识点: 1. **随机字符串生成**: 验证码通常由一组随机字符组成,可以是字母、数字或两者混合。在Java中,我们可以使用`java.util....

    JAVA识别验证码,支持变形,扭曲,斜线,噪点,支持自己训练

    在JAVA实现验证码识别的过程中,我们可能用到以下关键技术: 1. 图像处理库:JAVA有许多图像处理库可供选择,如Java Advanced Imaging (JAI)、OpenCV的JAVA接口或ImageJ。这些库提供了丰富的函数,用于进行图像处理...

    验证码(JAVA实现)

    验证码(JAVA实现)验证码(JAVA实现)验证码(JAVA实现)验证码(JAVA实现)

    JAVA实现各种验证码的源代码

    验证码在信息技术领域中扮演着重要的...总的来说,JAVA实现验证码的源代码是一个很好的学习资源,不仅能够帮助开发者理解图形处理、随机数生成以及网络通信等相关知识,还能够提升他们在实际项目中解决安全问题的能力。

Global site tag (gtag.js) - Google Analytics