/*
* Created on 2004-8-4
*
* To change the template for this generated file go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
package myclass.test;
import java.awt.*;
import java.awt.image.*;
import java.util.*;
/**
* @author
*
* To change the template for this generated type comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
public class Image {
public String sRand="";
public Color getRandColor(int fc,int bc){//給定范圍獲得隨機(jī)顏色
Random random = new Random();
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);
}
public BufferedImage creatImage(){
// 在內(nèi)存中創(chuàng)建圖象
int width=60, height=20;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 獲取圖形上下文
Graphics g = image.getGraphics();
//生成隨機(jī)類
Random random = new Random();
// 設(shè)定背景色
g.setColor(getRandColor(200,250));
g.fillRect(0, 0, width, height);
//設(shè)定字體
g.setFont(new Font("Times New Roman",Font.PLAIN,18));
//畫邊框
//g.setColor(new Color());
//g.drawRect(0,0,width-1,height-1);
// 隨機(jī)產(chǎn)生155條干擾線,使圖象中的認(rèn)證碼不易被其它程序探測到
g.setColor(getRandColor(160,200));
for (int i=0;i<155;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);
}
// 取隨機(jī)產(chǎn)生的認(rèn)證碼(4位數(shù)字)
//String rand = request.getParameter("rand");
//rand = rand.substring(0,rand.indexOf("."));
for (int i=0;i<4;i++){
String rand=String.valueOf(random.nextInt(10));
sRand+=rand;
// 將認(rèn)證碼顯示到圖象中
g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//調(diào)用函數(shù)出來的顏色相同,可能是因為種子太接近,所以只能直接生成
g.drawString(rand,13*i+6,16);
}
// 圖象生效
g.dispose();
return image;
}
}
======================================================================
image.jsp(對bean的引用)
<%@ page contentType="image/jpeg" import="javax.imageio.*" %>
<jsp:useBean id="image" scope="session" class="myclass.test.Image"/>
<%
//設(shè)置頁面不緩存
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
// 將認(rèn)證碼存入SESSION
session.setAttribute("rand",image.sRand);
// 輸出圖象到頁面
ImageIO.write(image.creatImage(), "JPEG", response.getOutputStream());
%>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
大家經(jīng)常在網(wǎng)上登陸的時候經(jīng)常會看到讓你輸入驗證碼,有的是文字的,有的呢是圖片,比如chinaren.com校友錄中留言的時候,我們就會看到數(shù)字圖片驗證碼;網(wǎng)上關(guān)于數(shù)字文字驗證碼實現(xiàn)方法的相關(guān)資料很多,而我們這里介紹的是數(shù)字和字母隨機(jī)組成的并且生成圖片的驗證碼的實現(xiàn)方法。看起來很復(fù)雜、其實很簡單的,大家跟著我往下看:
首先,我們先介紹一下設(shè)計思路,數(shù)字和字母的隨機(jī)組合生成驗證碼,然后將驗證碼生成圖片,這里“數(shù)字和字母的組合”應(yīng)該是隨機(jī)取出來的;如果是專門的數(shù)字驗證碼,我們可以這樣實現(xiàn):
ycodenum=4 '驗證碼的位數(shù),或者說成個數(shù)
for i=1 to ycodenum
Randomize '初始化隨機(jī)數(shù)發(fā)生器
ycode=ycode&Int((9*Rnd)) 'rnd是隨機(jī)數(shù),從0到1之間的任意實數(shù),這里獲得0到9之間的整數(shù)
next
response.write ycode '就可以輸出數(shù)字驗證碼(4位)
然而,我們要讓數(shù)字和字母同樣隨機(jī)生成,這里我們可以用到數(shù)組來實現(xiàn)這種效果,如下:
ychar="0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z" '將數(shù)字和大寫字母組成一個字符串
yc=split(char,",") '將字符串生成數(shù)組
ycodenum=4
for i=1 to ycodenum
Randomize
ycode=ycode&yc(Int((35*Rnd))) '數(shù)組一般從0開始讀取,所以這里為35*Rnd
next
response.write ycode
現(xiàn)在看看輸出結(jié)果是不是數(shù)字和字母隨機(jī)組合的呢?
下面看看怎樣生成圖片,這個也許有些朋友知道:asp不能生成圖片,必須使用asp組件。不錯,我們這里使用的是ASP圖象組件shotgraph。有一點(diǎn)大家注意,服務(wù)器不是自己的不能用哦,因為你裝不了這組件。
組件的下載地址: Response.BinaryWrite (img)
針對以上代碼也就是說shotgraph普通的畫圖的原理請參考:http://www.pconline.com.cn/pcedu/empolder/wz/asp/10204/45207.html