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