<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();
    %>


    主站蜘蛛池模板: 免费福利视频导航| 国产成人精品免费视频大全五级 | 亚洲色图视频在线观看| ww在线观视频免费观看| 亚洲国产欧美国产综合一区| 一区二区三区观看免费中文视频在线播放| 亚洲精品一级无码鲁丝片| 亚洲美国产亚洲AV| 免费看国产精品3a黄的视频| 国产91成人精品亚洲精品| 亚洲高清视频在线观看| 日本在线免费播放| 国产AV无码专区亚洲AVJULIA| 无码毛片一区二区三区视频免费播放| 国产午夜免费福利红片| 色欲国产麻豆一精品一AV一免费| 亚洲成av人影院| 免费看香港一级毛片| 大桥未久亚洲无av码在线| 免费观看美女裸体网站| 国产成人亚洲精品电影| 免费在线观看理论片| 亚洲毛片免费视频| 一个人看的www免费高清| 亚洲一区在线视频观看| 日韩免费观看的一级毛片| 久久这里只精品99re免费| 免费大片av手机看片高清| 亚洲熟妇av一区二区三区漫画| 美女巨胸喷奶水视频www免费| 亚洲精品国产精品乱码在线观看| 黄网站色视频免费在线观看的a站最新| 亚洲av永久无码精品表情包| 最近中文字幕mv免费高清在线| 亚洲三级在线播放| 又粗又硬免费毛片| 无码一区二区三区免费视频| 添bbb免费观看高清视频| 亚洲国产精品日韩在线观看 | 免费一级毛片在播放视频| 中文字幕成人免费高清在线|