jsp實現驗證碼

來源:互聯網
上載者:User

標籤:

在web開發領域裡面,驗證碼是一個比較常見的功能,而歸根到底,驗證碼其實就是一組隨機數,或者是一個隨機算術

一、基本知識

1、為什麼需要驗證碼?

驗證碼,很多時候出現在註冊頁面或者登陸介面,在這些頁面中有可能會出現惡意註冊和暴力破解,這時候驗證碼可以有效防範這些攻擊。所以,總的來說,驗證碼很多時候是為了防止不法分子對網站進行惡意的註冊和攻擊,是一種有效攔截手段。

2、驗證碼的工作原理

  首先,我們要明確一點就是,驗證碼實際是在伺服器端產生的,因為如果在前端參數的話並不能有效攔截,因此很多時候,在攔截時我們都需要在伺服器端進行相關操作,防止駭客繞過前端驗證直接非法訪問。

  驗證碼的工作原理其實方几個步驟:首先,服務端隨機產生幾個隨機數或者隨機算式,然後通過session對象將資料轉送到用戶端,用戶端輸入驗證碼,通過r表單將資料提交到伺服器,伺服器提取資料之後和產生的隨機數字或者算式的結果對比,以此進行驗證。

  當然,很多時候,簡單的驗證碼很容易被Image Recognition軟體破解,所以現在很多時候更流行簡訊驗證等方式,但是,一下討論的均是簡單的數字圖片驗證。

二、驗證碼的實現過程

1、首先,驗證碼其實就是在服務端產生一張帶有驗證碼數字或者算式的圖片,所以,在這個過程要用到gui知識,具體請先看一下代碼

//1、驗證碼介面//驗證碼的寬和高int width = 70;int height = 30;/**映像緩衝對象(注意:在多次對某個對象操作時,為了提高效率,很多時候選擇用緩衝對象來進行操作,因為緩衝類的對象很多時候是可以即時改變對象的資料的)*/BufferedImage bufferedImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);//建立映像操作對象,用於操作驗證碼圖片對象Graphics2D g = bufferedImage.createGraphics();//建立字型對象方便操作映像字型的屬性Font font = new Font("Times New Roman",Font.PLAIN,18);g.setFont(font);//設定相關顏色等等g.setColor(Color.BLACK);g.drawRect(0,0,width-1,height-1);g.setColor(Color.GRAY);

  以上建立了一個基本的驗證碼圖片,注意很多時候如果要反覆對象對某個對象進行修改操作時(如某個字串,需要反覆進行拼接操作時,為提高效能,一般選擇用緩衝類的對象進行操作之後再轉換為相關對象)。以上是產生驗證碼的gui主要代碼,具體的步驟不囉嗦了,請參考代碼吧。

2、建立好相關的驗證碼圖片介面之後,下一步就是產生隨機數了,請先看以下代碼:

//2、產生隨機數//定義產生隨機數的對象Random random = new Random();//產生幹擾線for(int i=0;i<40;i++){//設定40條幹擾線int x1 = random.nextInt(width);int y1 = random.nextInt(height);int x2 = random.nextInt(10);int y2 = random.nextInt(10);//將隨機線條描繪到驗證碼對象中g.drawLine(x1,y1,x1+x2,y1+y2);}//產生隨機數//定義隨機數的個數int length = 4//定義 變數儲存隨機數字變數BufferedString str_random = new BufferedString();//定義成緩衝字元類型是為了提高效率for(int i=0;i<length;i++){int num_random = random.nextInt(10);String str_num = String.valueOf(num_random);g.drawString(str_num);str_random.append(str_num);}

  以上主要通過Random隨機數產生對象來產生隨機數字,其中注意要在反覆第String類型操作的時候,將其定義成BufferedString進行操作比較高效。具體的操作並沒有涉及什麼新技術,請查看代碼。

3、完成產生隨機數的步驟之後,剩下的就是將產生的隨機數發送出去了。請看代碼

//3、發送驗證碼圖片資料bufferedImg.flush();//重新整理與映像緩衝有關的資料g.dispose();//釋放與Graphice2D有關的對象的資源String randomCode = str_random.toString();session.setAttribute("randomCode",randomCode.toString());//通過session傳遞隨機碼給其他頁面用於驗證身份ServletOutputStream outputStream = response.getOutputStream();ImageIO.write(bufferedImg,"jpeg",outputStream);outputStream.close();out.clear();out=pageContext.pushBody();

  以上的發送驗證碼也是比較簡單,只是通過網路流進行發送操作,其中,注意Graphics2D的資源釋放和IO流的關閉就好了。其中,將驗證碼通過session發送給其他頁面使用。

三、總結

以上實現了簡單的數字驗證碼功能,其中涉及到的技術主要是javaGUI、IO操作和servlet技術的session技術。類似的,實現算式的驗證碼也是類似的步驟,具體的就不多說,下面的代碼是實現了簡單的算式驗證碼的代碼參考:

int width = 70,height = 22;if(request.getParameter("width")!=null){try{width=Integer.parseInt(request.getParameter("width"));}catch(NumberFormatException e) {}}BufferedImage bufferedImg = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);Graphics2D g = bufferedImg.createGraphics();g.setColor(Color.WHITE);g.fillRect(0,0,width,height);Font font = new Font("Times New Roman",Font.PLAIN,18);g.setFont(font);g.setColor(Color.BLACK);g.drawRect(0,0,width-1,height-1);g.setColor(Color.GRAY);Random random = new Random();//設定隨機種子for(int i=0;i<40;i++){//設定40條幹擾線int x1 = random.nextInt(width);int y1 = random.nextInt(height);int x2 = random.nextInt(10);int y2 = random.nextInt(10);g.drawLine(x1,y1,x1+x2,y1+y2);}int length = 4;//設定預設產生四個長度的驗證碼if(request.getParameter("length")!=null){try{length = Integer.parseInt(request.getParameter("length"));}catch(NumberFormatException e){out.println("<script>alert(‘無法載入驗證碼,請重新操作!‘)</script");e.printStackTrace();}}//定義變數儲存運算結果int result = 0;//定義一個int用於儲存某個數字後面的運算子,1代表+,2代表-,初始化為0int int_sign = 0;for(int i = 0;i<length;i++){//擷取隨機數字字串int num_random = random.nextInt(10);//根據符號標記標量int_sign進行相應的運算if(int_sign==2){result = result - num_random;}else{result = result + num_random;}String strRand = String.valueOf(num_random);g.setColor(Color.RED);g.drawString(strRand,13 * i + 6, 16);//隨機擷取運算子號if(i<length-1){int sign_random = random.nextInt(2);if(sign_random<1){g.setColor(Color.GREEN);g.drawString("+",13 * i + 12, 16);int_sign = 1;}else{g.setColor(Color.BLUE);g.drawString("-",13 * i + 12, 16);int_sign = 2;}}else{g.drawString("=?",13 * i + 12, 16);}}bufferedImg.flush();g.dispose();session.setAttribute("randomCode",result);response.setContentType("image/jpeg");response.setHeader("Pragam","no-cache");response.setHeader("Cache-Control","no-cache");response.setDateHeader("Expires",0);ServletOutputStream outputStream = response.getOutputStream();ImageIO.write(bufferedImg,"jpeg",outputStream);outputStream.close();out.clear();out=pageContext.pushBody();

  好了,驗證碼的總結就到此結束,有什麼不足的地方請各位大神指正!

 

jsp實現驗證碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.