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

首先實現一個servlet用來生成圖片(當然也可以用jsp實現):

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"); //必須設置ContentType為image/jpeg

int length = 4; //設置默認生成4個數字

Date d = new Date();

long lseed = d.getTime();

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

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)); //生成隨機數字

}

//可以在此加入保存驗證碼的代碼

//創建內存圖像

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) {



}

}

}



然后在需求顯示驗證碼的加入以下代碼就可以了

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



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