图形验证码

原创 2007年09月18日 23:54:00
        图形验证码是现在很多服务程序为防止恶意程序而在注册或者登陆的时候增加的一种安全验证措施,用图像显示某些字符串,并添加了一定的干扰图像,保证人眼可以识别而程序无法识别。
        今天在书上看到实现图形验证码的程序,觉得只是简单实现,即不完善,写法也不规范,于是自己重写了一遍,作为锻炼,刚好贴出来,也顺便作为开 blog 第一贴。如有不妥之处,欢迎指点。

代码清单如下:
/** *//**
 * 此类描述一个图形校验码。
 * 
 * 图形校验码通常用于注册或登录页面。
 
*/

package greenis

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

import javax.imageio.ImageIO;

/** *//**
 * 
@author Greeenis
 * 
 * 
@version 1.0
 *
 * 2007/09/18
 
*/

public class ValidateCode 
...{
    
// 默认图形宽度。
    private static int WIDTH = 80;
    
    
// 默认图形高度。
    private static int HEIGHT = 20;
    
    
// 默认验证码长度。
    private static int LENGTH = 4;
    
    
private char[] charMap;
    
private int width;
    
private int height;
    
private int codeLength;
    
    
/** *//**
     * 构造方法
     * 
     * 接收四个参数,分别描述图形宽度、长度、校验码长度和校验码字符范围。
     * 构造一个用户自定义的图形验证码。
     * 
     * 
@param width
     * 
@param height
     * 
@param codeLength
     * 
@param charArrayString
     
*/

    
public ValidateCode(int width, int height, int codeLength, String charArrayString)
    
...{
        
this.setWidth(width);
        
this.setHeight(height);
        
this.setCodeLength(codeLength);
        
this.setCharMap(charArrayString);
    }

    
    
/** *//**
     * 构造方法
     * 
     * 接收一个参数:描述验证码码字符范围。
     * 构造一个图形宽度为80像素,高度为20像素,验证码长度为4位的图形验证码。
     * 
     * 
@param charArrayString
     
*/

    
public ValidateCode(String charArrayString)
    
...{
        
this(000, charArrayString);
    }

    
    
/** *//**
     * 构造方法
     * 
     * 构造一个图形宽度为80像素,高度为20像素,验证码长度为4为,
     * 验证码范围为“a~z”和“0~9”之间的图形验证码。
     
*/

    
public ValidateCode()
    
...{
        
this(000"");
    }

    
    
public char[] getCharMap() ...{
        
return charMap;
    }


    
public void setCharMap(String charArrayString) ...{
        
if(charArrayString == "")
        
...{
            charArrayString 
= "abcdefghigkLmnopqrstuvwxyz1234567890";
            charMap 
= charArrayString.toCharArray();
        }

        
else
        
...{
            charMap 
= charArrayString.toCharArray();
        }

    }


    
public int getCodeLength() ...{
        
return codeLength;
    }


    
public void setCodeLength(int codeLength) ...{
        
if(codeLength <= 0)
        
...{
            
this.codeLength = LENGTH;
        }

        
else
        
...{
            
this.codeLength = codeLength;
        }

    }


    
public int getHeight() ...{
        
return height;
    }


    
public void setHeight(int height) ...{
        
if(height <= 0)
        
...{
            
this.height = HEIGHT;
        }

        
else
        
...{
            
this.height = height;
        }

    }


    
public int getWidth() ...{
        
return width;
    }


    
public void setWidth(int width) ...{
        
if(width <= 0)
        
...{
            
this.width = WIDTH;            
        }

        
else
        
...{
            
this.width = width;
        }

    }

    
    
/** *//**
     * 指定输出流,生成一个图形验证码并返回相应的验证码字符串。
     * 
     * 
@param output
     * 
@return validationCodeString
     
*/

    
public String getValidateCode(OutputStream output)
    
...{
        
// 验证码字符串。
        String validateCodeString = "";
        
        
// 图形验证码。
        BufferedImage image = 
            
new BufferedImage(this.width, this.height, BufferedImage.TYPE_INT_RGB);
        Graphics graphics 
= image.getGraphics();
        
        
// 设置背景色。
        graphics.setColor(new Color(0xDCDCDC));
        graphics.fillRect(
00this.width, this.height);
        
        
// 设置边框。
        graphics.setColor(Color.BLACK);
        graphics.drawRect(
00this.width-1this.height-1);
        
        
// 随机生成 codeLength 位验证码
        for(int index = 0; index < this.codeLength; index ++)
        
...{
            Random random 
= new Random();
            validateCodeString 
+= this.charMap[random.nextInt(charMap.length - 1)];
        }

        graphics.setColor(Color.BLACK);
        graphics.setFont(
new Font("Atlantic Inline", Font.PLAIN, (this.height * 9 / 10)));
        
for(int index = 0; index < (this.codeLength); index ++)
        
...{
            String subValidateCodeString 
= "";
            subValidateCodeString 
= validateCodeString.substring(index, index + 1);
            
int baseX = (int)(this.width / this.codeLength * index + 5);
            
int baseY = (int)(this.height * 9 / 10);
            graphics.drawString(subValidateCodeString, baseX, baseY);
        }

        
        
// 根据图形面积不同,按照 1:50 的比例,随机生成个椭圆干扰点。
        for(int index = 0; index < ((int)(this.width * this.height / 50)); index ++)
        
...{
            Random random 
= new Random();
            
int x = random.nextInt(this.width);
            
int y = random.nextInt(this.height);
            
int ovalWidth = random.nextInt(4);
            
int ovalHeight = random.nextInt(4);
            graphics.drawOval(x, y, ovalWidth, ovalHeight);
        }

        
        
// 释放验证码图形。
        graphics.dispose();
        
try ...{
            ImageIO.write(image, 
"JPEG", output);
        }
 catch (IOException e) ...{
            e.printStackTrace();
            
return "";
        }

        
        
return validateCodeString;
    }

}

验证码之图像验证码

1、在App的开发中,各种验证码层出不穷。    现在主流的验证码方式是: 1、手机验证码:就是用户使用手机获取短信得到验证码,在输入App中。2、就是App 生成图形,展示在用户的手机上,用户根据...
  • zhoushuangjian511
  • zhoushuangjian511
  • 2017年04月13日 09:46
  • 883

JAVA图形验证码

JAVA代码: VerifyCodeUtils类,生成图片流: package unic;import java.awt.Color; import java.awt.Font; import...
  • lys1220
  • lys1220
  • 2017年06月16日 11:03
  • 205

图形验证码的破解与设计

图形验证码设计目的是利用人脑的不可模拟性来防止机器自动识别.但是一个设计低级的图形验证码(可以被快速破解)除了增加网络流量以外没有任何意义.网上太多的"生成验证码"的教程把重点放在如何生成图片上,而实...
  • axman
  • axman
  • 2007年03月28日 10:56
  • 10929

JS如何制作图形验证码

实际效果第一步我们来到要展示验证码的页面,当我们按下营业执照的时候让其,弹出一个弹框,弹框的上面就是验证码,如图一所示: (图一)弹框的样式如图二所示: (图二)我们要对验证码的值进行校验,判断验...
  • qq_24147051
  • qq_24147051
  • 2016年09月13日 10:17
  • 6558

如何编写jsp图形验证码

方法一: 页面:       网上选课系统----登录界面 funct
  • shiyuntian_wang
  • shiyuntian_wang
  • 2010年06月22日 14:56
  • 3320

网站注册图形验证码

后台代码:package cn.itcast.shop.user.action; import java.awt.Color; import java.awt.Font; import java.a...
  • jethai
  • jethai
  • 2016年08月28日 14:01
  • 375

每日一学(一)android图形验证码的实现

一、实现原理分析                本质上是一个自定义View,不过是一张带颜色的背景图 + 要绘制的验证码+横线+若干小点点                    实现步骤:      ...
  • u010838555
  • u010838555
  • 2017年06月09日 23:50
  • 374

PHP图形操作之生成图像验证码

简单的验证码其实就是在图片中输出了几个字符,通过我们前面章节讲到的imagestring函数就能实现。但是在处理上,为了使验证码更加的安全,防止其他程序自动识别,因此常常需要对验证码进行一些干扰处理,...
  • madman_wang
  • madman_wang
  • 2017年03月31日 10:37
  • 234

spring mvc的服务器端图形验证码

Spring mvc 的服务器端图形验证码~~ 如下代码是我将图形验证码的代码用spring mvc写了一下 非常不错的基础图形验证码~ ---------------------- @RestCon...
  • s297165331
  • s297165331
  • 2016年02月22日 22:58
  • 1299

自动识别图形验证码

现在大多数网站都采用了验证码来防止暴力破解或恶意提交。但验证码真的就很安全吗?真的就不能被机器识别?? 我先讲讲我是怎么实现站外提交留言到一个网站的程序。 这个网站的留言版大致如下: ...
  • fengyee_zju
  • fengyee_zju
  • 2013年12月21日 22:21
  • 1116
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:图形验证码
举报原因:
原因补充:

(最多只允许输入30个字)