1. 程式人生 > >Java實現驗證碼(上)

Java實現驗證碼(上)

ins check dom 後臺 類繼承 訪問 and text 出錯

  眾所周知,現在登錄註冊各種網站賬號很多都要求輸入驗證碼。設置驗證碼,毫無疑問降低了用戶體驗,但為什麽各種網站還仍然使用驗證碼呢?

  很明顯,驗證碼有其特殊的作用:驗證碼是一種區分用戶是計算機還是人的公共全自動程序。它能夠防止惡意破解密碼、刷票、論壇灌水、刷頁等。想想看,如果沒有驗證碼,每次登錄網站只需用戶名和密碼,這時,一些心術不正的黑客可以利用暴力窮舉的方法破解密碼,而且,黑客們還可以不斷刷新訪問同一個網站,使其負擔加重,嚴重時能夠導致網站崩潰。所以設置驗證碼就成了必要了。

  廢話不多說,我將在這裏介紹四種常見的驗證碼實現,分別是用jsp和servlet實現簡單的字母數字驗證碼、利用Kaptcha組件實現驗證碼、中文驗證碼實現、算術驗證碼實現。

  驗證碼的實現可以分為幾步:生成驗證碼並呈現出來,判斷用戶輸入的驗證碼是否準確,處理結果。

  (一)jsp和servlet實現簡單的字母數字驗證碼

  首先先看最終效果:

  技術分享

  最終呈現的是數字和字母的隨機組合。

  eclipse項目目錄如下:

  技術分享

  下面來看詳細實現:

  ①首先實現前端呈現。由於重點是後臺邏輯實現,所以前端寫得比較簡單,只有一個表單:

  技術分享

  處理表單的類為LoginServlet,在LoginServlet中判斷用戶輸入是否準確;驗證碼圖片是由ImageServlet生成並呈現;用javascript實現“看不清楚”功能,點擊後重新發送請求。需要註意的是,由於緩存的作用,如果只是單單再用ImageServlet生成一個,它並不會更換。要實現更換功能,可以在後面加上後綴,使得每次請求的url不同(用隨機數有時會出錯,具體原因請google之)。

  ②ImageServlet類繼承HttpServlet類, 重寫doGet方法。要生成驗證碼並以圖片形式呈現,主要有以下6個步驟:

    ·定義BufferedImage對象

    ·獲得Graphics

    ·通過Random產生隨機驗證碼信息

    ·使用Graphics繪制圖片

    ·記錄驗證碼信息到session中

    ·使用ImageIO輸出圖片

  代碼如下:

  技術分享

  ③LoginServlet比較簡單,只需要通過session獲取生成的驗證碼和用戶輸入的比較,然後各自處理即可。

  技術分享

  寫完代碼後配置好web.xml就大功告成了!!!

  (二)利用Kaptcha組件實現

  用Kaptcha組件來實現比較簡單,因為它會幫你生成驗證碼圖片。首先要導入Kaptcha包。

  目錄如下:

  技術分享

  index.jsp還是類似,現在img的src可以寫固定的jpg,Kaptcha會自動幫你生成不同的圖片:

  技術分享

  KaptchaServlet.java是jar包上提供的,復制過去即可。

  check.jsp檢查驗證碼是否正確,這裏就不多說了,見下:

  技術分享

  最後配置web.xml文件。Kaptcha有很多的屬性可以配置:驗證碼圖片大小,文本內容等等很多很多,有興趣的可以深入研究,這裏我只給出最簡單的示例:

  技術分享

  最終運行結果如下:

  技術分享

  完整代碼見:https://github.com/lingd3/Captcha

Java實現驗證碼(上)