?現(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)):
首先實(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的全路徑。