?現(xiàn)在有不少網(wǎng)站在用戶填寫表單時(shí),同時(shí)要求填寫驗(yàn)證碼,驗(yàn)證碼的一個(gè)目的就是防范一些惡意的網(wǎng)站下載軟件,這些軟件能通過遍歷鏈接而將網(wǎng)站的所有網(wǎng)頁下載。還可以防止用戶不經(jīng)過本網(wǎng)站的頁面而使用網(wǎng)站的資源。所以現(xiàn)在有不少網(wǎng)站都使用了驗(yàn)證碼技術(shù),驗(yàn)證碼通常是一個(gè)在WEB服務(wù)器上生成的隨機(jī)字符串,同時(shí)以某種方式保存起來,比如保存到與當(dāng)前的Session中,然后在用戶提交網(wǎng)頁時(shí)與用戶輸入的驗(yàn)證比較是否一致,然而如果直接以明文的方式,還是不能防范一些功能較強(qiáng)的自動(dòng)填寫表格的軟件。所以一般將驗(yàn)證碼以圖片的形式顯示出來,同時(shí)可以將在圖片中顯示的字符串進(jìn)行一些處理,比如使用旋轉(zhuǎn)字符,添加背景紋理等技術(shù)以增大被軟件識(shí)別的難度。下面簡要介紹一下如果實(shí)現(xiàn)這種驗(yàn)證碼:

首先實(shí)現(xiàn)一個(gè)servlet用來生成圖片(當(dāng)然也可以用jsp實(shí)現(xiàn)):

import javax.servlet.*;

import javax.servlet.http.*;

import java.io.*;

import java.util.*;

import com.sun.image.codec.jpeg.*;

import java.awt.*;

import com.sun.image.codec.jpeg.*;

import java.awt.image.BufferedImage;

import java.awt.image.DataBuffer;

import java.awt.geom.GeneralPath;

import javax.swing.*;

import java.math.*;

public class Servlet1

extends HttpServlet {

//Process the HTTP Get request

public void doGet(HttpServletRequest request, HttpServletResponse response) throws

ServletException, IOException {

response.setContentType(CONTENT_TYPE);

response.setContentType("image/jpeg"); //必須設(shè)置ContentType為image/jpeg

int length = 4; //設(shè)置默認(rèn)生成4個(gè)數(shù)字

Date d = new Date();

long lseed = d.getTime();

java.util.Random r = new Random(lseed); //設(shè)置隨機(jī)種子

if (request.getParameter("length") != null) {

try {

length = Integer.parseInt(request.getParameter("length"));

}

catch (NumberFormatException e) {

}

}

StringBuffer str = new StringBuffer();

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

str.append(r.nextInt(9)); //生成隨機(jī)數(shù)字

}

//可以在此加入保存驗(yàn)證碼的代碼

//創(chuàng)建內(nèi)存圖像

BufferedImage bi = new BufferedImage(40, 16, BufferedImage.TYPE_INT_RGB);

Graphics2D g = bi.createGraphics();

g.clearRect(0, 0, 16, 40);

g.setColor(Color.green.CYAN);

g.drawString(str.toString(), 4, 12);

try {

//使用JPEG編碼,輸出到response的輸出流

JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(response.

getOutputStream());

JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);

param.setQuality(1.0f, false);

encoder.setJPEGEncodeParam(param);

encoder.encode(bi);

}

catch (Exception ex) {



}

}

}



然后在需求顯示驗(yàn)證碼的加入以下代碼就可以了

<img alt="" src="/WebModule1/servlet1" width="40" height="16"/>



將/WebModule1/servlet1替換成你用來生成驗(yàn)證碼的servlet的全路徑。