java实现简单的验证码(待增强)

package com.xxx;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;

import org.junit.Test;

public class IdentifyingCode {
    
    private final int WIDTH = 70;
    private final int HEIGHT = 30;
    private final byte[] BACKGROUND_COLOR = new byte[]{127, 127, 127};
    private final String FONT_STYLE = "微软雅黑";
    private final char[] IDETIFYING_CODE = new char[]{‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘, ‘a‘, ‘b‘, ‘c‘, ‘d‘};
    private final int CODE_LENGTH= 4;
    private final int FONT_SIZE = 17;
    
    //生成验证码图
    public BufferedImage createIdentifyingCode(){
        StringBuilder sb = new StringBuilder();
        
        BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_3BYTE_BGR);
        //得到画笔
        Graphics2D g =  image.createGraphics();
        //得到之前画笔的颜色
        Color color = g.getColor();
        
        //画图片边框
        this.drawImageCheek(g);
        this.drawCamouflageLine(g, 8);
        //设置背景色
        g.setBackground(new Color(BACKGROUND_COLOR[0]+128, BACKGROUND_COLOR[1]+128, BACKGROUND_COLOR[2]+128));
        //设置字体大小及其样式
        g.setFont(new Font(FONT_STYLE, Font.PLAIN, (int)(this.FONT_SIZE)){
            private static final long serialVersionUID = 1L;});
        
        //将验证字符加入图中
        for(int i=0; i<CODE_LENGTH; i++){
            //设置画笔颜色
            g.setColor(this.randomColor());
            //得到随机字符
            char charCode = IDETIFYING_CODE[this.randomNumber(0, IDETIFYING_CODE.length-1)];
            sb.append(charCode);
            //将字符写到图片中
            System.out.println(sb);
            //g.rotate(this.randomNumber(45, 135));
            g.drawString(""+charCode, WIDTH/5*(i+1)-5, (this.FONT_SIZE)+this.randomNumber(0, this.FONT_SIZE/2));
            
        }
        
        try {
            ImageIO.write(image, "jpeg", new FileOutputStream("D:/11.jpeg"));
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return image;
    }
    
    /**
     * 按照随机三原色生成一个颜色
     *
     * @return 颜色
     */
    public Color randomColor(){
        int min = 0;
        int max = 255;
        int red = randomNumber(min, max);
        int green = randomNumber(min, max);
        int yellow = randomNumber(min, max);
        return new Color(red, green, yellow);
    }
    
    public void drawCamouflageLine(Graphics2D g, int quantity){
        Color oldColor = g.getColor();
        for(int i=0; i<quantity; i++){
            g.setColor(this.randomColor());
            g.drawLine(this.randomNumber(0, this.WIDTH), this.randomNumber(0, this.HEIGHT), this.randomNumber(0, this.WIDTH), this.randomNumber(0, this.HEIGHT));
        }
        g.setColor(oldColor);
    }
    
    /**
     * 绘制图片内侧边框
     *
     * @param g 画笔
     */
    public void drawImageCheek(Graphics2D g){
        Color oldColor = g.getColor();
        g.setColor(new Color(255, 255, 255));
        g.drawLine(0, 0, this.WIDTH-2, 0);
        g.drawLine(0, 0, 0, this.HEIGHT-2);
        g.drawLine(0, this.HEIGHT-2, this.WIDTH-2, this.HEIGHT-2);
        g.drawLine(this.WIDTH-2, 0, this.WIDTH-2, this.HEIGHT-2);
        g.setColor(oldColor);
    }
    
    public int randomNumber(int min, int max){
        return (int)((Math.random()*(max-min+1))+min);
        
    }
    
    public static void main(String[] args) {
        new IdentifyingCode().createIdentifyingCode();
    }
}

其中待解决的问题:背景没有设置正确

待优化:验证图中的验证码需要旋转增加程序识别难度

这是目前的效果

时间: 2024-07-31 11:36:36

java实现简单的验证码(待增强)的相关文章

java识别简单的验证码

1.老规矩,先上图 要破解类似这样的验证码: 拆分后结果: 然后去匹配,得到结果. 2.拆分图片 拿到图片后,首先把图片中我们需要的部分截取出来. 具体的做法是,创建一个的和图片像素相同的一个代表权重的二维数组,遍历图片的每个像素点,如果接近白色,就标记为1,否则标记为0: 然后遍历这个二维数据,如果一个竖排都1,说明是空白列,直到第一次遇到不全为1一列,记住列的下标作为起始值,再次遇到全为1的,记住下标作为结束值,然后从起始列到结束列截取图片,依次类推. 1 //分割图片 2 private

java实现生成简单图片验证码

原文:java实现生成简单图片验证码 源代码下载地址:http://www.zuidaima.com/share/1550463428840448.htm 项目载图: 该项目要转换为Dynamic web project http://www.zuidaima.com/blog/1618162161323008.htm 另外缺少jar包: http://www.zuidaima.com/jar/search/jstl-1.0.1.htm http://www.zuidaima.com/jar/s

java生成简单验证码图片

概要 最近项目需要用java实现输出随机验证码图片到前台,正好有机会接触下java的绘图类,完成需求后也有时间做个总结,写篇随笔记录下也希望能帮助到有同样需求的人! 需求流程图 1.生成随机数 在java中生成随机数无非就是调用Random的api,但为了后续更好的实用,应该分成多种组合以适应需求的变化,应将生成随机数的个数和类型组合还有排除字符抽取成参数,这个也比较简单,没有什么难度,就直接贴上代码 1 /** 2 * 生成随机验证码 3 * @param type 类型 4 * @param

自己动手用写简单的验证码(JAVA)

自己动手用写简单的验证码(JAVA) 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.HttpSer

java使用servlet画出最简单的验证码一

前面已经说明验证码存在的意义,接下来本片文章将讲解如何实现一个简单的验证码. 在进行表单设计时,验证码的增加可以实现是否为"人为"操作,增加验证码可以防止网站数据库信息的冗杂... 验证码作为一个图片,在页面中是"画"出来的,那么它是如何画出来的呢? 其中需要几个生成图片的类: { 1.BufferedImage图像数据缓冲区 2.Graphics绘制图片 3.color获取颜色 4.Random获取随机数 5.ImageIO输出图片 } =============

Java SE 6 新特性: HTTP 增强--转

概述 Java 语言从诞生的那天起,就非常注重网络编程方面的应用.随着互联网应用的飞速发展,Java 的基础类库也不断地对网络相关的 API 进行加强和扩展.在 Java SE 6 当中,围绕着 HTTP 协议出现了很多实用的新特性:NTLM 认证提供了一种 Window 平台下较为安全的认证机制:JDK 当中提供了一个轻量级的 HTTP 服务器:提供了较为完善的 HTTP Cookie 管理功能:更为实用的 NetworkInterface:DNS 域名的国际化支持等等. NTLM 认证 不可

单一功能学习----简单的验证码

一.验证码的作用 1.防止大量重复请求.一般在登录的时候需要验证码,验证码的作用就是拖延时间,让每次登录的操作时间间隔变长,这样可以防止有人暴力破解密码登录. 二.设计思路 1.最简单的验证码,就是一串数字了.小时候看到的就是这个样子的,4个数字. 2.这串数字应该是随机的. 3.这串数字是可以更换的(以前看到的换一张按钮). 4.要有一个输入框,输入验证码. 5.每登录一次,若失败应该更换验证码. 6.稍微高级一点,验证码可以变成一张图片,防止恶意软件直接从前端代码获取验证码值. 7.更高级的

java关于集合的遍历与增强for循环(foreach)的使用

java集合类的使用可以说是无处不在,总的我们可以将之分为三大块,分别是从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型集合. 许多情况需要我们遍历出集合中的元素,并做相应的处理. 下面对各种类型的集合的遍历做一些总结,关于增强for循环,需要注意的是,使用增强for循环无法访问数组下标值,对于集合的遍历其内部采用的也是Iterator的相关方法.如果只做简单遍历读取,增强for循环确实减轻不少的代码量. 关于List与Set类型集合的遍历: 1 import

简单的验证码

简单的验证码 验证码 1. 本质:图片 2. 目的:防止恶意表单注册 创建CheckCodeServlet 并在其中写验证码 package wdnmd.web.servlet; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.annotation.WebServlet; impor