Java驗證碼—ValidateCode的使用
Java驗證碼—ValidateCode的使用
一、關於為何使用驗證的解釋
在目前的網頁的登入、註冊中經常會見到各種驗證碼。其目的便是為了:防止暴力破解 .因為只要CPU效能較強,便可以在慢慢嘗試密碼的過程中來破解使用者賬號,因而導致的結果是使用者資訊不安全。
但是如果使用驗證碼,一旦使用者輸入的密碼或賬號不正確時,驗證碼也會立馬改變,這樣便在一定程度上實現了安全性。
二、利用Java程式碼來實現驗證碼功能
為了避免上面原因造成的結果,Java中提供了相應的方法來實現驗證功能。
1.建立一個servlet在其中寫下面程式碼
(1)在doGet方法中
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- test2(response);
- }
(2)單獨提出來的test2方法中
- private void test2(HttpServletResponse response) throws IOException{
- int width=110;
- int height=25;
- //1.在記憶體中建立一個影象物件
- BufferedImage img=new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);// 構造一個型別為預定義影象型別之一的 BufferedImage。
- //表示一個具有 8 位 RGB 顏色分量的影象,對應於 Windows 或 Solaris 風格的 BGR 顏色模型,具有打包為整數畫素的 Blue、Green 和 Red 三種顏色。
- //2.建立一個畫筆
- Graphics g=img.getGraphics();
- //3給背景圖片新增一個顏色
- g.setColor(Color.PINK);
- g.fillRect(1, 1, width-2, width-2);//建議使用IE瀏覽器訪問,Google瀏覽器和獲取均顯示為居中的圖片,ie顯示左上角
- //4.給邊框一個色
- g.setColor(Color.RED);
- g.drawRect(0, 0, width-1, height-1);
- //5.設定文字樣式
- g.setColor(Color.BLUE);
- g.setFont(new Font("宋體",Font.BOLD|Font.ITALIC,15));//Font物件 ----根據指定名稱、樣式和磅值大小,建立一個新 Font。
- //6.給圖片新增文字
- Random rand=new Random();
- int position=20;
- for(int i=0;i<4;i++){
- g.drawString(rand.nextInt(10)+"", position, 20);//給圖片填充文字
- position+=20;
- }
- //7.將圖片以物件流的方式輸出到客戶端
- ImageIO.write(img, "jpg", response.getOutputStream());
- }
得到的結果是(在IE瀏覽器中的顯示效果,如果在Google瀏覽器、火狐瀏覽器中將會顯示在螢幕中間,且周圍為黑色):
通常見到的驗證碼顯示在登入、註冊中。所以講驗證碼內容放在html中
(3)在NewFile.html中
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>Insert title here</title>
- <script type="text/javascript">
- //得到圖片元素
- function changeCode(){
- var img = document.getElementsByTagName("img")[0];
- img.src = "/ee10_request_response/servlet/ServletDemo01";
- }
- </script>
- </head>
- <body>
- <form action="#" method="post">
- 使用者名稱:<input type="text" name="username"/><br/>
- 密碼:<input type="password" name="psw"/><br/>
- 驗證碼:<input type="text" name="code"/>
- <img src="/ee10_request_response/servlet/ServletDemo01" onclick="changeCode()"/><a href="javascript:changeCode()">看不清換一張</a><br/>
- <input type="submit" value="登入"/><br/>
- </form>
- </body>
- </html>
上面的驗證碼雖然得到了,但是點選更換驗證碼時,卻沒有立馬更改,這是為什麼呢?
三、瀏覽器快取
1.問題提出
在上面的html中,由於點選“看不清換一張”或點選圖片時,javascript的導向地址是同一個地址。瀏覽器將會認為是一樣的,故不會進行重新整理驗證碼。為了解決上面的問題,可以 在html中進行以下的更改
這種方法雖然實現了當點選更換驗證碼時,驗證碼得到了改變,但是也同時存在問題。那便是當點選一次後,驗證碼更換,但再次點選時由於同樣有快取,所以驗證碼值改變一次
2.解決方案
由於時間總是改變的,並且永不相等。所以可以利用獲取當前時間的方法來改變。利用Date().getTime()方法來獲取當前時間
通過以上方法便可以成功解決存在的問題。
四、利用驗證碼工具ValidateCode來實現
由於Java提供了ValidateCode這個jar包,所以變不需要再進行人工編寫程式碼來實現
(1)在servlet中寫以下程式碼
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- ValidateCode vc=new ValidateCode(110,25,4,9);
- String code=vc.getCode();
- vc.write(response.getOutputStream());
- }
同樣可以進行上面的驗證改變,但是同樣存在問題:瀏覽器會產生快取,一旦重新整理頁面驗證本來應該改變,但實際上並沒有改變。
(2)解決方案
在servlet中寫下以下程式碼:
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- //告訴客戶端不使用快取
- response.setHeader("param", "no-cache");
- response.setHeader("cache-control", "no-cache");
- response.setIntHeader("expires", 0);
- ValidateCode vc=new ValidateCode(110,25,4,9);
- String code=vc.getCode();
- vc.write(response.getOutputStream());
- }
五、總結
以上便是我對於Java中驗證碼的使用以及ValidateCode工具使用的較淺認識。一般情況下使用較多的是工具類,但是必須牢記瀏覽器快取的因素。以上的總結如果存在錯誤,期望能及時提出,謝謝!
相關文章
- java之使用Servlet生成驗證碼的原始碼分享JavaServlet原始碼
- Java 驗證碼、二維碼Java
- java識別驗證碼Java
- java實現驗證碼Java
- Google的kaptcha驗證碼使用GoAPT
- 驗證碼機制之驗證碼重複使用
- java實現動態驗證碼原始碼——繪製驗證碼的jspJava原始碼JS
- Java製作驗證碼的完整程式碼Java
- 使用JCaptcha生成驗證碼APT
- 使用java完成ldap身份驗證JavaLDA
- java身份證驗證程式碼IdcardUtils.java分享Java
- java圖形驗證碼實現Java
- 關於用java生成驗證碼Java
- 驗證碼原理及驗證
- 使用Docker部署帶密碼驗證的RedisDocker密碼Redis
- Java實現郵箱驗證碼功能Java
- 學習 Java 之 位元組碼驗證Java
- 驗證碼---js重新整理驗證碼JS
- 使用node+puppeteer破解驗證碼
- 使用 Java 操作 Git-驗證相關JavaGit
- Java+springboot最簡單的驗證碼的獲取與使用方式JavaSpring Boot
- 使用java連線AD域,驗證賬號密碼是否正確Java密碼
- 【總結】Java實現簡訊驗證碼Java
- ACCESS 密碼驗證/文字驗證中的小坑密碼
- PHP算式驗證碼和漢字驗證碼的實現方法PHP
- 在國內使用Google驗證碼reCaptchaGoAPT
- 網路驗證之授權碼使用
- JavaScript驗證碼生成和驗證效果JavaScript
- 坑爹的驗證碼。。
- 登入驗證碼生成kaptcha(輸入驗證碼)APT
- 幽默:證明真人的新驗證碼
- 菜鳥學Java(六)——簡單驗證碼生成(Java版)Java
- 推薦一款漂亮的 Java 圖形驗證碼Java
- Laravel - 驗證碼Laravel
- PHP驗證碼PHP
- 驗證碼程式
- 如何使用git的hook來驗證程式碼規範GitHook
- laravel修改使用者模組的密碼驗證Laravel密碼