現在許多系統的注冊登錄或者發布信息模塊都添加的隨機驗證碼功能就是為了避免自動注冊程序或者自動發布程序的使用
驗證碼實際上就是隨機選擇一些字符以圖片的形式展現在頁面上如果進行提交操作的同時需要將圖片上的字符同時提交如果提交的字符與服務器session保存的不同則認為提交信息無效為了避免自動程序分析解析圖片通常會在圖片上隨機生成一些干擾線或者將字符進行扭曲增加自動識別驗證碼的難度
在這裡我們使用java實現驗證碼
<%@ page contentType=image/jpeg import=javaawt*javaawtimage*javautil*javaximageio* %>
<%!
Color getRandColor(int fcint bc){//給定范圍獲得隨機顏色
Random random = new Random();
if(fc>) fc=;
if(bc>) bc=;
int r=fc+randomnextInt(bcfc);
int g=fc+randomnextInt(bcfc);
int b=fc+randomnextInt(bcfc);
return new Color(rgb);
}
%>
<%
//設置頁面不緩存
responsesetHeader(PragmaNocache);
responsesetHeader(CacheControlnocache);
responsesetDateHeader(Expires );
// 在內存中創建圖象
int width= height=;
BufferedImage image = new BufferedImage(width height BufferedImageTYPE_INT_RGB);
// 獲取圖形上下文
Graphics g = imagegetGraphics();
//生成隨機類
Random random = new Random();
// 設定背景色
gsetColor(getRandColor());
gfillRect( width height);
//設定字體
gsetFont(new Font(Times New RomanFontPLAIN));
// 隨機產生條干擾線使圖象中的認證碼不易被其它程序探測到
gsetColor(getRandColor());
for (int i=;i<;i++)
{
int x = randomnextInt(width);
int y = randomnextInt(height);
int xl = randomnextInt();
int yl = randomnextInt();
gdrawLine(xyx+xly+yl);
}
// 取隨機產生的認證碼(位數字)
String codeList = ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz;
String sRand=;
for (int i=;i<;i++){
int a=randomnextInt(codeListlength());
String rand=codeListsubstring(aa+);
sRand+=rand;
// 將認證碼顯示到圖象中
gsetColor(new Color(+randomnextInt()+randomnextInt()+randomnextInt()));//調用函數出來的顏色相同可能是因為種子太接近所以只能直接生成
gdrawString(rand*i+);
}
// 將認證碼存入SESSION
sessionsetAttribute(randsRand);
// 圖象生效
gdispose();
// 輸出圖象到頁面
ImageIOwrite(image JPEG responsegetOutputStream());
outclear();
out = pageContextpushBody();
%>
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25536.html