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 阅读(306) 评论(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();
%>



只有注册用户登录后才能发表评论。


网站导航: