現在有不少網站在用戶填寫表單時,同時要求填寫驗證碼,驗證碼的一個目的就是防范一些惡意的網站下載軟件,這些軟件能通過遍歷鏈接而將網站的所有網頁下載。還可以防止用戶不經過本網站的頁面而使用網站的資源。所以現在有不少網站都使用了驗證碼技術,驗證碼通常是一個在 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 的全路徑。

?