作业帮 > 字数作文 > 教育资讯

转载图片要输验证码

来源:学生作业帮助网 编辑:作业帮 时间:2024/09/29 17:31:54 字数作文
转载图片要输验证码字数作文

篇一:生成图片验证码实例

Util包中,公共的方法:

package com.jquery.test.util;

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.image.BufferedImage;

import java.util.Random;

import javax.imageio.ImageIO;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

public class CreateValidateImage {

// 放到session中的key,这个值不是固定的,可以自己随便写

public static final String RANDOMCODEKEY = "RANDOMVALIDATECODEKEY"; private Random random = new Random();

// 随机产生的字符串

private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; private int width = 80;// 图片宽

private int height = 26;// 图片高

private int lineSize = 40;// 干扰线数量

private int stringNum = 4;// 随机产生字符数量

/*

* 获得字体

*/

private Font getFont() {

return new Font("Fixedsys", Font.CENTER_BASELINE, 18);

}

/*

* 获得颜色

*/

private Color getRandColor(int fc, int bc) {

if (fc > 255)

fc = 255;

if (bc > 255)

bc = 255; int r = fc + random.nextInt(bc - fc - 16);

int g = fc + random.nextInt(bc - fc - 14);

int b = fc + random.nextInt(bc - fc - 18);

return new Color(r, g, b);

}

/**

* 生成随机图片

*/

public void getRandcode(HttpServletRequest request,

HttpServletResponse response) {

HttpSession session = request.getSession();

// BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类 BufferedImage image = new BufferedImage(width, height,

BufferedImage.TYPE_INT_BGR);

// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作

Graphics g = image.getGraphics();

g.fillRect(0, 0, width, height);

g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18)); g.setColor(getRandColor(110, 133));

// 绘制干扰线

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

drowLine(g);

}

// 绘制随机字符

String randomString = "";

for (int i = 1; i <= stringNum; i++) {

randomString = drowString(g, randomString, i);

}

session.removeAttribute(RANDOMCODEKEY);

session.setAttribute(RANDOMCODEKEY, randomString);

System.out.println(randomString);

g.dispose();

try {

// 将内存中的图片通过流动形式输出到客户端

ImageIO.write(image, "JPEG", response.getOutputStream()); } catch (Exception e) {

e.printStackTrace();

}

}

/*

* 绘制字符串

*/

private String drowString(Graphics g, String randomString, int i) { g.setFont(getFont());

g.setColor(new Color(random.nextInt(101), random.nextInt(111), random.nextInt(121)));

String rand =

String.valueOf(getRandomString(random.nextInt(randString

.length())));

randomString += rand;

g.translate(random.nextInt(3), random.nextInt(3));

g.drawString(rand, 13 * i, 16);

return randomString;

}

/*

* 绘制干扰线

*/

private void drowLine(Graphics g) {

int x = random.nextInt(width);

int y = random.nextInt(height);

int xl = random.nextInt(13);

int yl = random.nextInt(15);

g.drawLine(x, y, x + xl, y + yl);

}

/*

* 获取随机的字符

} */ public String getRandomString(int num) { return String.valueOf(randString.charAt(num)); }

Action中直接调用Util包中的方法:

public String getImg(){

HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse(); //设置相应类型,告诉浏览器输出的内容为图片

response.setContentType("image/jpeg");

//设置响应头信息,告诉浏览器不要缓存此内容

response.setHeader("Pragma", "No-cache");

response.setHeader("Cache-Control", "no-cache");

response.setDateHeader("Expire", 0);

RandomValidateCode randomValidateCode = new RandomValidateCode(); try {

randomValidateCode.getRandcode(request, response);//输出图片方法

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

Html或jsp页面:


title="点击更换" onclick="javascript:

refresh('jq/getImg.action?temp='+(new Date().getTime().toString(36)));" src="jq/getImg.action">

Js:

//刷新验证图片,

function refresh(url) {

//temp='+(new Date().getTime().toString(36))

//连接加上这个表示清楚缓存,

$("#imgValidate").attr("src",url);

}

验证输入验证码是否正确:

public String validateImg() throws IOException{

HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse(); response.setCharacterEncoding("UTF-8");

request.setCharacterEncoding("UTF-8");

//在创建图片时,session的Attribute的值是由自己所设置,

String resultStr = (String)

request.getSession().getAttribute("RANDOMVALIDATECODEKEY");

//设置不区分大小写,同意转换成大写.

this.setValidateStr(validateStr.toUpperCase());

if(resultStr.equals(validateStr)){

response.getWriter().write("{success:true,result:'成功'}"); }else{

response.getWriter().write("{success:false,result:'失败'}"); }

response.getWriter().flush();

response.getWriter().close();

return null;

}

篇二:图片验证码技术

思路:

图片验证码的实现主要的技术点是如何生成一个图片。生成图片可以使用java.awt包下的类来实现。我们先写一个简单的生成图片的程序HelloImage.java。以下是代码部分。

package com.vogoal.test;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

import javax.imageio.ImageIO;

/**

* @author SinNeR@blueidea.com

* create a image

*/

public class HelloImage {

public static void main(String[] args){

BufferedImage image = new BufferedImage(80, 25,

BufferedImage.TYPE_INT_RGB);

Graphics g = image.getGraphics();

g.setColor(new Color(255,255,255));

g.fillRect(0, 0, 80, 25);

g.setColor(new Color(0,0,0));

g.drawString("HelloImage",6,16);

g.dispose();

try{

ImageIO.write(image, "jpeg", new File("C:\\helloImage.jpeg"));

}catch(IOException e){

e.printStackTrace();

}

}

}

编译后,在DOS下调用这个程序,正常情况下,会在C盘根目录下生成一张名字helloImage.jpeg为的图片。图片上有文字HelloImage。

简单介绍下生成图片的流程:

建立BufferedImage对象。指定图片的长度宽度和色彩。

BufferedImage image = new BufferedImage(80,25,BufferedImage.TYPE_INT_RGB); 取得Graphics对象,用来绘制图片。

Graphics g = image.getGraphics(); 绘制图片背景和文字。 释放Graphics对象所占用的资源。

g.dispose(); 通过ImageIO对象的write静态方法将图片输出。

ImageIO.write(image, "jpeg", new File("C:\\helloImage.jpeg"));知道了图片的生成方法,剩下的问题就是如何将随机数生成到页面上了。要显示图片,我们只要将生成的图片流返回给response对象,这样用户请求的时候就可以得到图片。而一个jsp页面的page参数的contentType属性可以指定返回的response对象的形式,我们平时的jsp页面中设定的contentType是text/html,所以会被以HTML文件的形式读取分析。如果设定为

image/jpeg,就会被以图片的形式读取分析。确定了这点后就可以着手实现。

修改生成图片的类,添加生成随机字符串的方法,并取得用户传过来的response对象将图片流输出到response对象中。同时为了更友好和可订制,添加了一个构造函数,可以修改图片验证码的长度,以及验证码的码字范围。并且可以设定验证码的背景色。(用户使用时可以设定验证图片的背景色与页面的背景色相同) 写一个jsp文件,用来调用生成验证码图片的类。并得到生成的验证码,存入session。以下是生成验证码图片的类RandImgCreater。(操作系统的原因,没有写注释,避免乱码)

package com.vogoal.util.img;

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

/**

* @author SinNeR

* http://bbs.blueidea.com

* image check creater

*/

public class RandImgCreater {

private static final String CODE_LIST =

"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";

private HttpServletResponse response = null;

private static final int HEIGHT = 20;

private static final int FONT_NUM = 4;

private int width = 0;

private int iNum = 0;

private String codeList = "";

private boolean drawBgFlag = false;

private int rBg = 0;

private int gBg = 0;

private int bBg = 0;

public RandImgCreater(HttpServletResponse response) {

this.response = response;

this.width = 13 * FONT_NUM + 12;

this.iNum = FONT_NUM;

this.codeList = CODE_LIST;

}

public RandImgCreater(HttpServletResponse response,int iNum,String codeList) {

this.response = response;

this.width = 13 * iNum + 12;

this.iNum = iNum;

this.codeList = codeList;

}

public String createRandImage(){

BufferedImage image = new BufferedImage(width, HEIGHT, BufferedImage.TYPE_INT_RGB);

Graphics g = image.getGraphics();

Random random = new Random();

if ( drawBgFlag ){

g.setColor(new Color(rBg,gBg,bBg));

g.fillRect(0, 0, width, HEIGHT);

}else{

g.setColor(getRandColor(200, 250));

g.fillRect(0, 0, width, HEIGHT);

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

篇三:图片验证码识别

图片验证码识别思路和方法(VB.Net)

作者:ntdrv 来源:ntdrv的博客 更新时间:2010-6-28

除了本文关于图片验证码识别的思路,乐博网还有一篇关于图片验证码的文章和源代码, 访问地址: VB.Ne图形验证码识别的源代码

图片验证码识别思路和方法(VB.Net) 由乐博网自转载 www.ntdrv.cn/Blog/Article.aspx?ID=2311

投票软件比较有技术含量的部分就在验证码识别。为防止投票作弊,很多投票网站都会加随机验证码,输入验证码后才能投票。但是加了验证码是否就能万无一失呢,也不尽然。虽然不是所有验证码都能识别(如QQ的变形汉字验证码是不太可能用软件识别的,个人觉得),但还是有很多验证码可以用软件来识别的。

下面以天涯博客里的评论验证码为例,说明验证码识别的基本思路和方法:

(网页截图)

第一步、获取验证码图片

C#可以用HttpWebRequest类GET验证码的网址,得到返回的数据流,再将数据流值赋给Bitmap变量。在Winform里放一个PictureBox控件,将它的Image属性指定为Bitmap变量,就可以显示出验证码图片了。

也可以使用Bitmap的Save方法将图片保存成Bmp文件。

Stream resStream = response.GetResponseStream();//得到验证码数据流

Bitmap sourcebm = new Bitmap(resStream);//初始化Bitmap图片

在Photoshop中将验证码图片放大1600%,如下:

第二步、将验证码图片去色(将彩色转换为灰度)

去色是为了进一步做成黑白双色图片。

Color c = sourcebm.GetPixel(x, y);

int luma = (int)(c.R * 0.3 + c.G * 0.59 + c.B * 0.11);//转换灰度的算法

sourcebm.SetPixel(x, y, Color.FromArgb(luma, luma, luma));

第三步、去杂色,转换为黑白图片

从灰度图片中可以看出,数字的颜色比较深,而杂色都是比较浅,所以可以设定一个临界颜色值,颜

色高于或等于这个值的设置为白色,低于这个值的设置为黑色。

Color c = sourcebm.GetPixel(x, y);

if (c.R >= critical_value)

sourcebm.SetPixel(x, y, Color.FromArgb(255, 255, 255));

else

sourcebm.SetPixel(x, y, Color.FromArgb(0, 0, 0));

第四步、动态得到每个数字的边界

for (int x = 0; x < sourcebm.Width; x++)

{

myColumn = true;

for (int y = 0; y < sourcebm.Height; y++)

{

Color c = sourcebm.GetPixel(x, y);

if (c.R == 0 && charStart == false)//第一次出现黑点

{

widthStartX[charNum] = x;

charStart = true;

break;

}

if (c.R == 0 && charStart == true)//后续出现黑点

{

myColumn = false;

break;

}

}

if (myColumn == true && charStart == true && widthStartX[charNum] < x)//如果当列没有黑点并且前面出现过黑点还没结束

{

widthEndX[charNum] = x - 1;

charStart = false;

charNum++;

}

if (charStart == true && myColumn == false && x == (bmp.Width - 1))//如果开始出现黑点了,并且最后一列也有黑点

{

widthEndX[charNum] = x;

charStart = false;

charNum++;

}

}

五、得到每个字符的特征码

在每个字符的边界内,检测每个象素,如果象素为白色则为"0",如果象素为黑色则为"1",将"0""1"连

起来就是该数字或字符的特征码。

Color c = sourcebm.GetPixel(x, y);

if (c.R == 0)

str = str + "1";

else

str = str + "0";

六、完成验证码图片的识别

将获取的特征码和对应的数字或字符保存起来,下次再将新获取的特征码跟保存的特征码对比,如果相同则提取对应的数字或字符,完成验证码的识别。

篇四:图形验证码的破解与设计

图形验证码的破解与设计

图形验证码设计目的是利用人脑的不可模拟性来防止机器自动识别.但是一个设计低级的图形验证码(可以被快速破解)除了增加网络流量以外没有任何意义.网上太多的”生成验证码”的教程把重点放在如何生成图片上,而实用性却几乎为零.生成图形本身是零基础技能,任何平台都提供内存图形环境和设备上下文(DC)让你操作,vc中的CDC,java/.NET中的Graphics,都提供比你需要的还要多的绘图API.可以说介绍这些东西根本没有必要.(竟然还在某些地方看到图形叠加叫做水印的,图片水印是指可分离的但合成后不可视的图形透明通道,用于象电子印章之类的加密验证技术).设计一个复杂的难以破解的图形验证码需要了解

常规的可以破解图形验证码的技术种类.

利用session生存期来凭肉眼设别一次后无限次使用同一图形验证码并不算图形验证码的破解.这只是没有经验的程序员设计上的逻辑BUG.即图形验证码的session存活期是全局的.而不是针对某次验证过程的.具体过程如下:

客户端请求一个图形验证码.服务器生成一个图形验证码并将验证码的内容放在session中.当客户端凭肉眼识别通过输入框提交验证码内容后,服务端和session中的内容比较通过.用户其它信息校验成功后成功登录.但这时验证码的session还没有过期,客户端用相同的内容还可以为另一次验证使用.所以每个验证过的验证码的session应该立即销毁.这种逻辑上的BUG可以被没有任何技术经验的人所破解.真正的对图形识别码进行破解,大多数是对验证码进行切割比对.假设图形验证码生成的图片上数字是1234

一.切割:首先利用一定算法可以将其切割成最小的四张图片.将四周的空白最大可能地去除.

二.退色:将彩色图片退色成黑白的.用两极法,在0-255中小于128的视为黑色,128到255视为白色.

三.去躁点,将连续黑色范围小于某值,比如小于最小笔划中点的区域做成白色.

四.再进行最小切割.

五.比对,利用已经做好的图形库进行象素比对.因为经过上面的处理,图象都成了黑白两色,以尺寸最匹配的图片进行比对.先拿图形库中干净的标本图片和没有去躁点的目标比对,看标本图片中每个黑色象素在目标中是否存在,如果都存在比对通过.目标图片中的黑点在标本图片中没有的应该为躁点.然后拿去躁后的目标图片的黑色象素去标本图片比对,看是标本图片中是否存在,如果都存在为通过.有可能去躁不切底,这个过程只能作为参考,通过则为充分条件,不通过不是必要否决条件.从上面比对过程我们可以看出.比对的最重要的一步是切割,如何能保证目标图片被成功要割成已有标本图的大小匹配是最关键的技术.如果你的图片内容生成时本身就是按规则生存有,比如

drawString时把一行内容串完整地画出来.那么间隔都是固定的,字符大小也是固定的.即使每次只画一个字,每个字意隔不同,但只要按最小切割,也就是把所有的行列中没有有效点的空白去切去,再以一套按最小切割的标本图来比较就很容易了.字体大小和样式(斜体,下划线,加粗),体型(黑体,宋体)的变化对增加难度不大,只要按不同字号和式样以及体型多备几套标本库,当然变化越多比对出错可能性越大,但从字体大小和式样上变化不是根本手段.如果你的验证码本身只有黑白两色那真正是让破解者太感谢了.复杂的颜色可以让其在退色过程中增加出错几率.长条形类似笔画的躁点,在比对时并不起多大作用,因为可以以标本图的象素去找目标图对应象素,躁点就是多余出来的.但长条形类型笔画的躁点加上不规则间隔对切割起到了巨大的阻碍作用.最最关键的要点是重叠技术. 两个字之间的部份重叠对于肉眼识别基本上没有障碍,但对于依赖切割比对的机器而言却是致命的克星.所以保证你的验证码内容中有一些文字内容部份的重叠.如果字数较长,比如8位,其中有两至三处的重叠,那么基本破解程序就死掉了.有些高级的破解程序利用色差切割,两个字的相交处的不同颜色来作为切割界限,在这里可以将重叠的字设同色.增加切割难度.

只要无法切割,那么其它方法就无计可施.所以设计一个难以切割的验证码是保证不被破解的最有力的保证.文字内容只增加比对时间而已,你用18030个中文字符和用10个数字,比对过程可能会增加1000多倍,对于机器比对而言难度不大,但很大地加强了标本图库的制作的难度.

下面是我用c#做的一个简单例子.复杂的设计用简单来说明,其实抓住最关键的地方就是至少保证有一次重叠,因为只是例子.真正实用的时候我会做出三次以上重叠.我用不同字号来何证间隔的不规则性.将原始阿位佰数字和转换后的数字都保存起来,用户可以根据图片内容只输入阿位佰数字或图片上的内容都可以.注意如果输入的内容中有不好输入的字应该提供一个软键盘之类的输入界

面.

string[] CharList = { “零壹贰叁肆伍陆柒捌玖”, “○一二三四五六七八九” }; int[] size = { 10, 12, 14 };

string[] fm = { “宋体”,”楷体_GB2312″,”黑体”};

这些常量定义都可以再复杂一些.

DateTime dt = DateTime.Now;

Random r = new Random();

int x = r.Next(10000, 100000);

string tmp = “”;

string src = x.ToString();

Bitmap bmp = new Bitmap(100, 20);

Graphics g = Graphics.FromImage(bmp);

g.FillRectangle(Brushes.White, 0, 0, 100, 20);

Console.WriteLine(src);

int lastSize = 0;

Color lastColor;

bool into = false;

for (int i = 0; i < 5; i++)

{

char ch = CharList[r.Next(0, 2)][Convert.ToInt32(src[i].ToString())];

tmp += ch;

int sz = size[r.Next(0, 3)];

if (i == 3 && !into) //总共5字,到了第4个还没的重叠的话那第四个要设成14号字 //保证重叠发生

sz = 14;

int cr = r.Next(0, 200);

int cg = r.Next(0, 200);

int cb = r.Next(0, 200);

Color c = Color.FromArgb(cr, cg, cb);

int sub = 0;

if (lastSize == 14) {//如果上一个字是14号,那么下一字向左入侵保证重叠

//对大字号重叠的可视性要比小字号强.

//重叠时最好将当前字符的颜色设为上一字符颜色

c = lastColor;

into = true;

sub = 8;

}

g.DrawString(ch.ToString(),

new Font(new FontFamily(fm[r.Next(0, fm.Length)]), sz),

new SolidBrush(c),

new Point(i * 20 – sub, 0));

//这里因为字号不同,间隔也不同,但每个字的起始点相同,可以修改根据上一个字 //的大小再调整起始点.

lastSize = sz;

lastColor = c;

}

bmp.Save(“d:/aaa.gif”);

Console.WriteLine(tmp);

TimeSpan ts = DateTime.Now – dt;

Console.WriteLine(ts.Milliseconds);

这样的过程在我的台式机上一般在15毫秒左右,在服务器上应该更快.

效果:

肉眼很容易识别,但机器却很难切割

其实这其中还有更多的技巧,但从总体而言就是保证不能被机器正确地切割.没有切割,那么就不能处理比对.

(当然利用银河机进行组合整体比对理论上也是可以的).在防切割上的重点设计才是真正的设计目标.

篇五:使用图形验证码

使用图形验证码

使用图形验证码

公开 内部公开√ 机密 绝密

陈劼

2008年2月20日

使用图形验证码 机密 绝密

目录

1 2 3 4

概述........................................................................................................................................... 3 配置web.xml ............................................................................................................................ 3 页面显示 ........................(来自:www.sMHaiDa.com 海 达范文网:转载图片要输验证码)........................................................................................................... 3 获取随机数 ............................................................................................................................... 4

使用图形验证码 机密 绝密

1 概述

本文简要说明了如何使用servlet输入图片验证码,以防止个别用户的恶意提交,本文使用的servlet是:com.cplatform.util.image.DrawConfirmCode.java。

2 配置web.xml

在web.xml内需要对此servlet进行说明和映射,常用的形式如下:

参数标明了生成的随机数存入session的key值,这里用的是“rand”。

3 页面显示

在需要显示验证码的页面上加入以下的代码即可显示验证码图片:

使用图形验证码 机密 绝密

4 获取随机数

每次请求验证码图片都会随机生成一个4位的数字,并以设定的key值存入session,

字数作文