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

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

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

    ice world

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

    仿騰訊隨機驗證圖片

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

    仿照騰訊的Token寫的驗證碼生成程序
    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));    // 設置背景色
            g.fillRect(00, width, height);    // 填充背景
            g.setColor(Color.BLACK);    // 繪制邊緣
            g.drawRect(-1-1, width + 1, height + 1);
            g.setColor(Color.GRAY);    
    // 設置字體,隨機選擇字體,暫設置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);    // 定義一個無干擾線區間和一個起始位置 
            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));    // 隨機設置像素點寬帶(線寬)
                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++{    // 旋轉圖形 
                int degree = (random.nextInt(20- 10% 360
                
    double ang = degree * 0.0174532925;    // 將角度轉為弧度 
                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"%>

    <%
        
    //設置頁面不緩存    
        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(
    "生成的隨機碼:" + randomCode);    
        BufferedImage image 
    = TokenUtil.createTokenImage(width, height, randomCode);    
        ImageIO.write(image, 
    "JPEG", response.getOutputStream());    
        response.flushBuffer();    
        out.clear();    
        out 
    = pageContext.pushBody();
    %>


    主站蜘蛛池模板: 亚洲精品国产成人99久久| 亚洲精品tv久久久久| 亚洲字幕在线观看| 国产啪精品视频网站免费尤物| 亚洲中文字幕丝袜制服一区| 新最免费影视大全在线播放| 国产又黄又爽又刺激的免费网址| 亚洲变态另类一区二区三区| 国产精品久免费的黄网站 | 妞干网在线免费视频| 色偷偷亚洲女人天堂观看欧| 成在人线AV无码免费| 亚洲精品GV天堂无码男同| 日韩激情无码免费毛片| 成人精品国产亚洲欧洲| 亚洲国产精品无码久久青草| 一区二区三区在线观看免费| 亚洲乱码国产乱码精品精| 一区二区三区四区免费视频| 亚洲精品国产第1页| 午夜老司机免费视频| 免费大片av手机看片高清| 精品亚洲永久免费精品| 精品亚洲AV无码一区二区| 日韩免费a级毛片无码a∨| 亚洲av日韩av激情亚洲| 最近高清中文字幕无吗免费看| 亚洲一区二区三区在线观看网站| 免费中文字幕一级毛片| 免费福利电影在线观看| 久久亚洲av无码精品浪潮| 小说专区亚洲春色校园| 亚洲啪啪AV无码片| 日本成年免费网站| 污污视频网站免费观看| 久久久久亚洲精品无码蜜桃 | 99精品视频免费在线观看| 狠狠亚洲婷婷综合色香五月排名| 免费av片在线观看网站| 亚洲国产综合AV在线观看| 亚洲欧洲成人精品香蕉网|