Java實現驗證碼(上)
眾所周知,現在登錄註冊各種網站賬號很多都要求輸入驗證碼。設置驗證碼,毫無疑問降低了用戶體驗,但為什麽各種網站還仍然使用驗證碼呢?
很明顯,驗證碼有其特殊的作用:驗證碼是一種區分用戶是計算機還是人的公共全自動程序。它能夠防止惡意破解密碼、刷票、論壇灌水、刷頁等。想想看,如果沒有驗證碼,每次登錄網站只需用戶名和密碼,這時,一些心術不正的黑客可以利用暴力窮舉的方法破解密碼,而且,黑客們還可以不斷刷新訪問同一個網站,使其負擔加重,嚴重時能夠導致網站崩潰。所以設置驗證碼就成了必要了。
廢話不多說,我將在這裏介紹四種常見的驗證碼實現,分別是用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實現驗證碼(上)