<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    中文JAVA技術平等自由協作創造

    Java專題文章博客和開源

    常用鏈接

    統計

    最新評論

    Java實現隨機驗證碼功能實例

      現在許多系統的注冊、登錄或者發布信息模塊都添加的隨機碼功能,就是為了避免自動注冊程序或者自動發布程序的使用雅思答案

      驗證碼實際上就是隨機選擇一些字符以圖片的形式展現在頁面上,如果進行提交操作的同時需要將圖片上的字符同時提交,如果提交的字符與服務器session保存的不同,則認為提交信息無效。為了避免自動程序分析解析圖片,通常會在圖片上隨機生成一些干擾線或者將字符進行扭曲,增加自動識別的難度。

      在這里,我們使用servlet來實現隨機驗證碼的實現。

      package com.servlet;

      import java.awt.Color;

      import java.awt.Font;

      import java.awt.Graphics2D;

      import java.awt.image.BufferedImage;

      import java.util.Random;

      import javax.imageio.ImageIO;

      import javax.servlet.ServletException;

      import javax.servlet.ServletOutputStream;

      import javax.servlet.http.HttpServlet;

      import javax.servlet.http.HttpServletRequest;

      import javax.servlet.http.HttpServletResponse;

      import javax.servlet.http.HttpSession;

      /**

      * 生成隨機驗證碼

      * @author bitiliu

      *

      */

      public class ValidateCodeServlet extends HttpServlet

      {

      private static final long serialVersionUID = 1L;

      //驗證碼圖片的寬度。

      private int width=60;

      //驗證碼圖片的高度。

      private int height=20;

      //驗證碼字符個數

      private int codeCount=4;

      private int x=0;

      //字體高度

      private int fontHeight;

      private int codeY;

      char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',

      'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',

      'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };

      /**

      * 初始化驗證圖片屬性

      */

      public void init() throws ServletException

      {

      //從web.xml中獲取初始信息

      //寬度

      String strWidth=this.getInitParameter("width");

      //高度

      String strHeight=this.getInitParameter("height");

      //字符個數

      String strCodeCount=this.getInitParameter("codeCount");

      //將配置的信息轉換成數值

      try

      {

      if(strWidth!=null && strWidth.length()!=0)

      {

      width=Integer.parseInt(strWidth);

      }

      if(strHeight!=null && strHeight.length()!=0)

      {

      height=Integer.parseInt(strHeight);

      }

      if(strCodeCount!=null && strCodeCount.length()!=0)

      {

      codeCount=Integer.parseInt(strCodeCount);

      }

      }

      catch(NumberFormatException e)

      {}

      x=width/(codeCount+1);

      fontHeight=height-2;

      codeY=height-4;

      }

      protected void service(HttpServletRequest req, HttpServletResponse resp)

      throws ServletException, java.io.IOException {

      //定義圖像buffer

      BufferedImage buffImg = new BufferedImage(

      width, height,BufferedImage.TYPE_INT_RGB);

      Graphics2D g = buffImg.createGraphics();

      //創建一個隨機數生成器類

      Random random = new Random();

      //將圖像填充為白色

      g.setColor(Color.WHITE);

      g.fillRect(0, 0, width, height);

      //創建字體,字體的大小應該根據圖片的高度來定。

      Font font = new Font("Fixedsys", Font.PLAIN, fontHeight);

      //設置字體。

      g.setFont(font);

      //畫邊框。

      g.setColor(Color.BLACK);

      g.drawRect(0, 0, width - 1, height - 1);

      //隨機產生160條干擾線,使圖象中的認證碼不易被其它程序探測到。

      g.setColor(Color.BLACK);

      for(int i = 0; i < 160; i++)

      {

      int x = random.nextInt(width);

      int y = random.nextInt(height);

      int xl = random.nextInt(12);

      int yl = random.nextInt(12);

      g.drawLine(x, y, x + xl, y + yl);

      }

      //randomCode用于保存隨機產生的驗證碼,以便用戶登錄后進行驗證。

      StringBuffer randomCode = new StringBuffer();

      int red = 0, green = 0, blue = 0;

      //隨機產生codeCount數字的驗證碼。

      for (int i = 0; i < codeCount; i++) {

      //得到隨機產生的驗證碼數字。

      String strRand = String.valueOf(codeSequence[random.nextInt(36)]);

      //產生隨機的顏色分量來構造顏色值,這樣輸出的每位數字的顏色值都將不同。

      red = random.nextInt(255);

      green = random.nextInt(255);

      blue = random.nextInt(255);

      //用隨機產生的顏色將驗證碼繪制到圖像中。

      g.setColor(new Color(red, green, blue));

      g.drawString(strRand, (i + 1) * x, codeY);

      //將產生的四個隨機數組合在一起。

      randomCode.append(strRand);

      }

      // 將四位數字的驗證碼保存到Session中。

      HttpSession session = req.getSession();

      session.setAttribute("validateCode", randomCode.toString());

      // 禁止圖像緩存。

      resp.setHeader("Pragma", "no-cache");

      resp.setHeader("Cache-Control", "no-cache");

      resp.setDateHeader("Expires", 0);

      resp.setContentType("image/jpeg");

      //將圖像輸出到Servlet輸出流中。

      ServletOutputStream sos = resp.getOutputStream();

      ImageIO.write(buffImg, "jpeg", sos);

      sos.close();

      }

      }

      需要在web.xml中聲明servlet

      ValidateCodeServlet

      com.servlet.ValidateCodeServlet

      width

      200

      height

      80

      codeCount

      5

      ValidateCodeServlet

      /validateCodeServlet

      用戶提交后就可以將用戶輸入的驗證碼與session中保存的字符串進行比對,達到驗證的效果雅思改分

    posted on 2013-06-09 22:51 好不容易 閱讀(193) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    PK10開獎 PK10開獎
    主站蜘蛛池模板: 亚洲熟女乱色一区二区三区| 国产成A人亚洲精V品无码性色 | 国产亚洲AV无码AV男人的天堂| 久久久久亚洲AV无码去区首| 日本一道高清不卡免费| jzzijzzij在线观看亚洲熟妇| 免费鲁丝片一级观看| 男男黄GAY片免费网站WWW| 婷婷亚洲天堂影院| 黄桃AV无码免费一区二区三区| 相泽亚洲一区中文字幕| 久久精品免费观看| 亚洲蜜芽在线精品一区| 可以免费看黄视频的网站| 亚洲av最新在线观看网址| 亚洲av无码成人精品区在线播放| 一级免费黄色毛片| 亚洲AV无码久久精品色欲| 100部毛片免费全部播放完整| 激情综合亚洲色婷婷五月| 日韩中文字幕免费| 又粗又长又爽又长黄免费视频| 亚洲国产婷婷六月丁香| 亚洲精品视频免费看| 本道天堂成在人线av无码免费| 亚洲尤码不卡AV麻豆| 久久99免费视频| 久久久久亚洲av无码专区喷水| 无人在线直播免费观看| 色婷婷六月亚洲综合香蕉| 亚洲尤码不卡AV麻豆| 97在线观看永久免费视频| 国产精品久久亚洲一区二区| 国产亚洲美女精品久久久| 成人免费的性色视频| 粉色视频在线观看www免费| 亚洲国产日韩在线视频| 女人张开腿给人桶免费视频| yellow视频免费看| 亚洲人成网站日本片| 国产亚洲精品无码专区|