ice world

          There is nothing too difficult if you put your heart into it.
          posts - 104, comments - 103, trackbacks - 0, articles - 0

          仿騰訊隨機(jī)驗(yàn)證圖片

          Posted on 2011-04-16 13:49 IceWee 閱讀(316) 評(píng)論(0)  編輯  收藏 所屬分類: Java

          仿照騰訊的Token寫的驗(yàn)證碼生成程序
          Java類代碼:

          package icewee.image;
          import java.awt.BasicStroke;
          import java.awt.Color;
          import java.awt.Font;
          import java.awt.Graphics2D;
          import java.awt.RenderingHints;
          import java.awt.geom.Line2D;
          import java.awt.image.BufferedImage;
          import java.util.Random;

          public class TokenUtil {
              
              
          private static final String base = "23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefhijklmnpqrstuvwxyz";
              
          private static final int length = base.length();
              
              
          public static BufferedImage createTokenImage(int width, int height, String randomCode) {
                  BufferedImage image 
          = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
                  Graphics2D g 
          = image.createGraphics();
                  Random random 
          = new Random();
                  g.setColor(
          new Color(230230250));    // 設(shè)置背景色
                  g.fillRect(00, width, height);    // 填充背景
                  g.setColor(Color.BLACK);    // 繪制邊緣
                  g.drawRect(-1-1, width + 1, height + 1);
                  g.setColor(Color.GRAY);    
          // 設(shè)置字體,隨機(jī)選擇字體,暫設(shè)置8種字體
                  Font font = new Font((new String[] "Arial""Arial Black""Arial Italic""Courier New""Courier New Bold Italic""Courier New Italic""Franklin Gothic Medium""Franklin Gothic Medium Italic" })[random.nextInt(8)], Font.PLAIN, 30); 
                  
          // g.setStroke(new BasicStroke((float)(Math.random()), BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL));
                  g.setFont(font);    // 定義字體顏色范圍
                  int red = random.nextInt(160), green = random.nextInt(50), blue = random.nextInt(50);    // 定義一個(gè)無干擾線區(qū)間和一個(gè)起始位置 
                  int nor = random.nextInt(50), rsta = random.nextInt(131);    // 繪制干擾正弦曲線 M:曲線平折度, D:Y軸常量 V:X軸焦距 
                  int M = random.nextInt(15+ 5, D = random.nextInt(23+ 15, V = random.nextInt(5+ 1;
                  
          double x = 0.0;
                  
          double y = M * Math.sin(Math.toRadians(V * x)) + D;
                  
          double px, py;        
                  
          for (int i = 0; i < 131; i++{
                      px 
          = x + 1;
                      py 
          = M * Math.sin(Math.toRadians(V * px)) + D;
                      
          if (rsta < i && i < (rsta + nor))   
                          g.setColor(
          new Color(230230250));
                      
          else
                          g.setColor(
          new Color(red, green, blue));    // 隨機(jī)設(shè)置像素點(diǎn)寬帶(線寬)
                      g.setStroke(new BasicStroke((float) (Math.random() + 1.5f)));
                      g.draw(
          new Line2D.Double(x, y, px, py));
                      x 
          = px;
                      y 
          = py;
                  }

                  
          char[] codes = randomCode.toCharArray();
                  
          for (int i = 0; i < codes.length; i++{    // 旋轉(zhuǎn)圖形 
                      int degree = (random.nextInt(20- 10% 360
                      
          double ang = degree * 0.0174532925;    // 將角度轉(zhuǎn)為弧度 
                      g.rotate(ang, width / 2, height / 2);
                      g.setColor(
          new Color(red, green, blue));
                      g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                      
          int gr = random.nextInt(8);
                      g.drawString(String.valueOf(codes[i]), 
          24 * i + 10 + gr, 38);
                  }

                  g.dispose();
                  
          return image;
              }

              
              
          public static String createRandomCode(int size, int width, int height) {
                  StringBuffer randomCode 
          = new StringBuffer();
                  
          for (int i = 0; i < size; i++{
                      Random random 
          = new Random();
                      
          int start = random.nextInt(length);
                      String strRand 
          = base.substring(start, start + 1);
                      randomCode.append(strRand);
                  }
                  
                  
          return randomCode.toString();    
              }

          }



          JSP頁面:

          <%@page contentType="image/jpeg" pageEncoding="GBK"%>
          <%@page import="java.awt.image.BufferedImage"%>
          <%@page import="javax.imageio.ImageIO"%>
          <%@page import="com.icesoft.image.TokenUtil"%>

          <%
              
          //設(shè)置頁面不緩存    
              response.setHeader(
          "Pragma""No-cache");    
              response.setHeader(
          "Cache-Control""no-cache");    
              response.setDateHeader(
          "Expires"0);    
              
          int width = 120, height = 50;    
              
          String randomCode = TokenUtil.createRandomCode(4, width, height);    
              System.out.println(
          "生成的隨機(jī)碼:" + randomCode);    
              BufferedImage image 
          = TokenUtil.createTokenImage(width, height, randomCode);    
              ImageIO.write(image, 
          "JPEG", response.getOutputStream());    
              response.flushBuffer();    
              out.clear();    
              out 
          = pageContext.pushBody();
          %>


          主站蜘蛛池模板: 巨野县| 巴青县| 蕲春县| 城口县| 武穴市| 澜沧| 平湖市| 百色市| 延寿县| 大田县| 海阳市| 鹰潭市| 太原市| 甘肃省| 德化县| 唐山市| 额尔古纳市| 黔江区| 屯留县| 深州市| 兴山县| 沙雅县| 孝义市| 咸宁市| 永德县| 乌鲁木齐市| 遂昌县| 广昌县| 新晃| 潢川县| 长宁县| 普安县| 张北县| 陈巴尔虎旗| 怀化市| 新野县| 海宁市| 漠河县| 乌苏市| 郁南县| 来凤县|