純JAVA技術驗證碼生成器(服務器端servlet實現)(不是javascript哦~)

          java驗證碼生成器,自認為還算經典import java.awt.Color;
          import java.awt.Font;
          import java.awt.Graphics;
          import java.awt.image.BufferedImage;
          import java.io.IOException;
          import java.util.Random;
          import javax.servlet.ServletOutputStream;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;
          import com.sun.image.codec.jpeg.JPEGCodec;
          import com.sun.image.codec.jpeg.JPEGImageEncoder;
          /**
          * @(#)VerifyCodeServlet.java Dec 9, 2007 8:14:14 PM
          *
          * @author Yuan
          * 驗證碼生成器,使用此類需要將表單里的驗證碼輸入框的name屬性設為"verifycode"
          */
          public class VerifyCodeGenerator {
              
              private static final VerifyCodeGenerator generator = new VerifyCodeGenerator();
              
              private final String ATTRIBUTE_NAME = "verifycode";
              //圖片的寬度
              private final int WIDTH = 15;
              //圖片的高度
              private final int HEIGHT = 22;
              //字符串長度
              private final int CODE_LENGTH = 4;
              //隨機字符串范圍
              private final String RAND_RANGE = "abcdefghijklmnopqrstuvwxyz"
                  + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                  + "1234567890"
                  + "@#quot;;
              
              private final char[] CHARS = RAND_RANGE.toCharArray();
              
              private Random random = new Random();
              
              private VerifyCodeGenerator(){
                  //
              }
              
              public static VerifyCodeGenerator getInstance(){
                  return generator;
              } 
               

              /**
               * 生成隨機字符串
               * @return 隨機字符串
               */
              private String getRandString(){
                  StringBuilder sb = new StringBuilder();
                  for (int i = 0; i < CODE_LENGTH; i++)
                      sb.append(CHARS[random.nextInt(CHARS.length)]);
                  return sb.toString();
              }
              
              /**
               * 生成隨機顏色
               * @param ll 產生顏色值下限(lower limit)
               * @param ul 產生顏色值上限(upper limit)
               * @return 生成的隨機顏色對象
               */
              private Color getRandColor(int ll, int ul){
                  if (ll > 255) ll = 255;
                  if (ll < 1) ll = 1;
                  if (ul > 255) ul = 255;
                  if (ul < 1) ul = 1;
                  if (ul == ll) ul = ll + 1;
                  int r = random.nextInt(ul - ll) + ll;
                  int g = random.nextInt(ul - ll) + ll;
                  int b = random.nextInt(ul - ll) + ll;
                  Color color = new Color(r,g,b);
                  return color;
              }
              
              /**
               * 生成指定字符串的圖像數據
               * @param verifyCode 即將被打印的隨機字符串
               * @return 生成的圖像數據
               * */
              private BufferedImage getImage(String verifyCode){
                  
                  BufferedImage image = new BufferedImage(WIDTH * CODE_LENGTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
                  
                  //獲取圖形上下文
                  Graphics graphics = image.getGraphics();
                  
                  //設置背景色
                  graphics.setColor(getRandColor(1,50));
                  //填充背景色
                  graphics.fillRect(0, 0, WIDTH * 4, HEIGHT);
                  
                  //設置邊框顏色
                  graphics.setColor(new Color(0,255,0));
                  //畫邊框
                  for (int i=0; i<2; i++)
                      graphics.drawRect(i, i, WIDTH * CODE_LENGTH - i * 2 - 1, HEIGHT - i * 2 - 1);
                  
                  //設置隨機干擾線條顏色
                  graphics.setColor(getRandColor(50,100));
                  //產生50條干擾線條
                  for (int i=0; i<50; i++){
                      int x1 = random.nextInt(WIDTH * CODE_LENGTH - 4) + 2;
                      int y1 = random.nextInt(HEIGHT - 4) + 2;
                      int x2 = random.nextInt(WIDTH * CODE_LENGTH - 2 - x1) + x1;
                      int y2 = y1;
                      graphics.drawLine(x1, y1, x2, y2);
                  }
                  
                  //設置字體
                  graphics.setFont(new Font("Times New Roman", Font.PLAIN, 18));
                  //畫字符串
                  for (int i=0; i<this.CODE_LENGTH; i++){
                      String temp = verifyCode.substring(i, i+1);
                      graphics.setColor(getRandColor(100,255));
                      graphics.drawString(temp, 13 * i + 6, 16);
                  } 
                   
                  //圖像生效
                  graphics.dispose();
                  
                  return image;
              }
              
              /**
               * 將驗證碼的圖像輸出
               * @param request 用戶的請求對象
               * @param response 用戶的響應對象
               * */
              public void printImage(HttpServletRequest request,
                      HttpServletResponse response){
                  //將ContentType設為"image/jpeg",讓瀏覽器識別圖像格式。
                  response.setContentType("image/jpeg");
                  //設置頁面不緩存
                  response.setHeader("Pragma", "No-cache");
                  response.setHeader("Cache-Control", "no-cache");
                  response.setDateHeader("Expires", 2000);
                  
                  //獲得隨機驗證碼
                  String verifyCode = this.getRandString();
                  String str = "ssss";
                  for(int i=0; i<10; i++)
                      str = str + str;
                  //獲得驗證碼的圖像數據
                  BufferedImage bi = this.getImage(verifyCode);
                  //把驗證碼存入session
                  request.getSession().setAttribute(ATTRIBUTE_NAME, verifyCode);
                  try{
                      //獲得Servlet輸出流
                      ServletOutputStream outStream = response.getOutputStream();
                      //創建可用來將圖像數據編碼為JPEG數據流的編碼器
                      JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outStream);
                      //將圖像數據進行編碼
                      encoder.encode(bi);
                      //強行將緩沖區的內容輸入到頁面
                      outStream.flush();
                      //關閉輸出流
                      outStream.close();
                  }catch(IOException ex){
                      ex.printStackTrace();
                  }
              }
              
              /**
               * 檢查輸入的驗證碼是否正確,若用戶輸入的驗證碼與生成的驗證碼相符則返回true,否則返回false。
               * @param request 用戶的請求對象
               * @return 驗證結果
               * */
              public boolean check(HttpServletRequest request){
                  if (((String)request.getParameter(ATTRIBUTE_NAME))
                          .equalsIgnoreCase((String)request.getSession().getAttribute(ATTRIBUTE_NAME))){
                      request.getSession().removeAttribute(ATTRIBUTE_NAME);
                      return true;
                  }
                  return false;
              }
          }
          /**此代碼為我們群老大深秋小雨
          所編寫,真的比較實用,來自qq群J道
          **/

          posted on 2008-04-05 12:40 伍興佳 閱讀(5464) 評論(10)  編輯  收藏

          評論

          # re: 純JAVA技術驗證碼生成器(服務器端servlet實現)(不是javascript哦~)[未登錄] 2008-04-05 21:21 子玉

          請問這個類該如何調用呢?能不能給個調用的例子?謝謝  回復  更多評論   

          # re: 純JAVA技術驗證碼生成器(服務器端servlet實現)(不是javascript哦~) 2008-04-05 22:00 伍興佳

          已經很清楚了啊,表單調用,服務端程序都是通過表單調用,驗證碼生成器,使用此類需要將表單里的驗證碼輸入框的name屬性設為"verifycode" ,不知道你是什么意思。@子玉
            回復  更多評論   

          # re: 純JAVA技術驗證碼生成器(服務器端servlet實現)(不是javascript哦~)[未登錄] 2008-04-06 12:27 子玉

          servlet如何調用這個類,還是直接寫到servlet里?
          前臺的request如何傳給VerifyCodeGenerator?對不起,我是新手上路  回復  更多評論   

          # re: 純JAVA技術驗證碼生成器(服務器端servlet實現)(不是javascript哦~) 2008-04-07 08:45 Jarod

          java生成驗證碼見的多,看標題博主好像會用JS生成,期望能在下篇文章中分享一下  回復  更多評論   

          # re: 純JAVA技術驗證碼生成器(服務器端servlet實現)(不是javascript哦~) 2008-04-07 12:30 伍興佳

          JS中我只會生成純數字和字符驗證碼,生成圖像的我不會。  回復  更多評論   

          # re: 純JAVA技術驗證碼生成器(服務器端servlet實現)(不是javascript哦~) 2008-04-08 13:55 lmjq

          謝謝分享,我用這個做了個例子,http://blog.csdn.net/lmjq/archive/2008/04/08/2259670.aspx
            回復  更多評論   

          # re: 純JAVA技術驗證碼生成器(服務器端servlet實現)(不是javascript哦~) 2008-12-05 11:51 jixinzheng@hotmail.com

          部署這個servlet以后在瀏覽器中只看到一個圖片的占位符,作者測過沒有?  回復  更多評論   

          # re: 純JAVA技術驗證碼生成器(服務器端servlet實現)(不是javascript哦~)[未登錄] 2009-10-05 13:52 呆呆

          這個驗證碼太不安全了。客戶端可以先獲得session 然后將這個值寫到你哪個文本框里。驗證碼就沒多太的意思了。  回復  更多評論   

          # re: 純JAVA技術驗證碼生成器(服務器端servlet實現)(不是javascript哦~) 2012-12-18 14:56 eee

          eeee  回復  更多評論   

          # re: 純JAVA技術驗證碼生成器(服務器端servlet實現)(不是javascript哦~) 2014-06-25 20:42 dsadas

          dasdasdad  回復  更多評論   


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


          網站導航:
           
          <2009年10月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導航

          統計

          公告

          這是伍嗲的純JAVA技術博客

          常用鏈接

          留言簿(1)

          隨筆檔案

          文章分類

          相冊

          技術鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 平罗县| 大关县| 兖州市| 郧西县| 宜都市| 南召县| 乌兰浩特市| 阳东县| 大庆市| 济宁市| 泽普县| 伊金霍洛旗| 新和县| 客服| 彭泽县| 荆门市| 仁化县| 长宁县| 台江县| 镇坪县| 青岛市| 依兰县| 朝阳区| 潼关县| 海口市| 个旧市| 纳雍县| 娄烦县| 甘泉县| 资源县| 昆山市| 兴业县| 长治县| 宜阳县| 阜新市| 什邡市| 怀安县| 周宁县| 永州市| 乐至县| 沾益县|