現在有不少網站在用戶填寫表單時,同時要求填寫驗證碼,驗證碼的一個目的就是防范一些惡意的網站下載軟件,這些軟件能通過遍歷鏈接而將網站的所有網頁下載。還可以防止用戶不經過本網站的頁面而使用網站的資源。所以現在有不少網站都使用了驗證碼技術,驗證碼通常是一個在 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(
????? encoder.setJPEGEncodeParam(param);
????? encoder.encode(bi);
??? }
??? catch (Exception ex) {
???
??? }
? }???
}??
然后在需求顯示驗證碼的加入以下代碼就可以了
<img alt="" src="/WebModule1/servlet1"?? width="40" height="16"/>
將 /WebModule1/servlet1 替換成你用來生成驗證碼的 servlet 的全路徑。
?