Java驗證碼—ValidateCode的使用

TuxedoLinux發表於2018-05-27
Java驗證碼—ValidateCode的使用

一、關於為何使用驗證的解釋

     在目前的網頁的登入、註冊中經常會見到各種驗證碼。其目的便是為了:防止暴力破解 .因為只要CPU效能較強,便可以在慢慢嘗試密碼的過程中來破解使用者賬號,因而導致的結果是使用者資訊不安全。


但是如果使用驗證碼,一旦使用者輸入的密碼或賬號不正確時,驗證碼也會立馬改變,這樣便在一定程度上實現了安全性。


二、利用Java程式碼來實現驗證碼功能

      為了避免上面原因造成的結果,Java中提供了相應的方法來實現驗證功能。
1.建立一個servlet在其中寫下面程式碼
(1)在doGet方法中
  1. public void doGet(HttpServletRequest request, HttpServletResponse response)  
  2.             throws ServletException, IOException {  
  3.         test2(response);  
  4.           
  5.     }  
(2)單獨提出來的test2方法中
  1. private void test2(HttpServletResponse response) throws IOException{  
  2.         int width=110;  
  3.         int height=25;  
  4.         //1.在記憶體中建立一個影象物件  
  5.         BufferedImage img=new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);// 構造一個型別為預定義影象型別之一的 BufferedImage。  
  6.                                                                                         //表示一個具有 8 位 RGB 顏色分量的影象,對應於 Windows 或 Solaris 風格的 BGR 顏色模型,具有打包為整數畫素的 Blue、Green 和 Red 三種顏色。                 
  7.         //2.建立一個畫筆  
  8.         Graphics g=img.getGraphics();   
  9.           
  10.         //3給背景圖片新增一個顏色  
  11.         g.setColor(Color.PINK);  
  12.         g.fillRect(11, width-2, width-2);//建議使用IE瀏覽器訪問,Google瀏覽器和獲取均顯示為居中的圖片,ie顯示左上角  
  13.           
  14.         //4.給邊框一個色  
  15.         g.setColor(Color.RED);  
  16.         g.drawRect(00, width-1, height-1);  
  17.           
  18.         //5.設定文字樣式  
  19.         g.setColor(Color.BLUE);  
  20.         g.setFont(new Font("宋體",Font.BOLD|Font.ITALIC,15));//Font物件 ----根據指定名稱、樣式和磅值大小,建立一個新 Font。  
  21.           
  22.         //6.給圖片新增文字  
  23.         Random rand=new Random();  
  24.         int position=20;  
  25.         for(int i=0;i<4;i++){  
  26.             g.drawString(rand.nextInt(10)+"", position, 20);//給圖片填充文字  
  27.             position+=20;  
  28.         }  
  29.           
  30.         //7.將圖片以物件流的方式輸出到客戶端  
  31.         ImageIO.write(img, "jpg", response.getOutputStream());  
  32.     }  

得到的結果是(在IE瀏覽器中的顯示效果,如果在Google瀏覽器、火狐瀏覽器中將會顯示在螢幕中間,且周圍為黑色):


通常見到的驗證碼顯示在登入、註冊中。所以講驗證碼內容放在html中

(3)在NewFile.html中
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  2. <html>  
  3. <head>  
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  5. <title>Insert title here</title>  
  6. <script type="text/javascript">  
  7.     //得到圖片元素  
  8.     function changeCode(){  
  9.         var img = document.getElementsByTagName("img")[0];  
  10.         img.src = "/ee10_request_response/servlet/ServletDemo01";  
  11.     }  
  12. </script>  
  13. </head>  
  14. <body>  
  15.     <form action="#" method="post">  
  16.         使用者名稱:<input type="text" name="username"/><br/>  
  17.         密碼:<input type="password" name="psw"/><br/>  
  18.         驗證碼:<input type="text" name="code"/>  
  19.         <img src="/ee10_request_response/servlet/ServletDemo01" onclick="changeCode()"/><a href="javascript:changeCode()">看不清換一張</a><br/>  
  20.         <input type="submit" value="登入"/><br/>  
  21.     </form>  
  22. </body>  
  23. </html>  
得到的結果如下:

上面的驗證碼雖然得到了,但是點選更換驗證碼時,卻沒有立馬更改,這是為什麼呢?

三、瀏覽器快取

1.問題提出
在上面的html中,由於點選“看不清換一張”或點選圖片時,javascript的導向地址是同一個地址。瀏覽器將會認為是一樣的,故不會進行重新整理驗證碼。為了解決上面的問題,可以 在html中進行以下的更改



這種方法雖然實現了當點選更換驗證碼時,驗證碼得到了改變,但是也同時存在問題。那便是當點選一次後,驗證碼更換,但再次點選時由於同樣有快取,所以驗證碼值改變一次


2.解決方案

由於時間總是改變的,並且永不相等。所以可以利用獲取當前時間的方法來改變。利用Date().getTime()方法來獲取當前時間


通過以上方法便可以成功解決存在的問題。

四、利用驗證碼工具ValidateCode來實現

由於Java提供了ValidateCode這個jar包,所以變不需要再進行人工編寫程式碼來實現

(1)在servlet中寫以下程式碼

  1. public void doGet(HttpServletRequest request, HttpServletResponse response)  
  2.             throws ServletException, IOException {  
  3.         ValidateCode vc=new ValidateCode(110,25,4,9);  
  4.         String code=vc.getCode();  
  5.         vc.write(response.getOutputStream());  
  6.           
  7.     }  
得到的結果:

同樣可以進行上面的驗證改變,但是同樣存在問題:瀏覽器會產生快取,一旦重新整理頁面驗證本來應該改變,但實際上並沒有改變。


(2)解決方案

在servlet中寫下以下程式碼:

  1. public void doGet(HttpServletRequest request, HttpServletResponse response)  
  2.             throws ServletException, IOException {  
  3.         //告訴客戶端不使用快取  
  4.         response.setHeader("param""no-cache");  
  5.         response.setHeader("cache-control""no-cache");  
  6.         response.setIntHeader("expires"0);  
  7.           
  8.         ValidateCode vc=new ValidateCode(110,25,4,9);  
  9.         String code=vc.getCode();  
  10.         vc.write(response.getOutputStream());  
  11.     }  


五、總結

以上便是我對於Java中驗證碼的使用以及ValidateCode工具使用的較淺認識。一般情況下使用較多的是工具類,但是必須牢記瀏覽器快取的因素。以上的總結如果存在錯誤,期望能及時提出,謝謝!




相關文章