六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 30|回复: 0

java验证码。

[复制链接]

升级  60%

6

主题

6

主题

6

主题

童生

Rank: 1

积分
30
 楼主| 发表于 2013-1-28 19:21:07 | 显示全部楼层 |阅读模式
package util.img;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
public class ValidateCodeImg {
// 验证码图片的宽度。
private int width=60;
// 验证码图片的高度。
private int height=20;
// 验证码字符个数
private int codeCount=4;

// 干扰线条数
private int line=20;

private int x=0;
// 字体高度
private int fontHeight;
private int codeY;
char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };

private String sessionStr;

public void writeImg(int width,int height,int codeCount,int line,OutputStream os) throws IOException{
  this.width=width;
  this.height=height;
  this.codeCount=codeCount;
  this.line=line;
  
  writeImg(os);
}

public void writeImg(OutputStream os) throws IOException{
  x=width/(codeCount+1);
  fontHeight=height-2;
  codeY=height-4;
  
//  定义图像buffer
  BufferedImage buffImg = new BufferedImage(
  width, height,BufferedImage.TYPE_INT_RGB);
  Graphics2D g = buffImg.createGraphics();
//  创建一个随机数生成器类
  Random random = new Random();
//  将图像填充为白色
  g.setColor(Color.WHITE);
  g.fillRect(0, 0, width, height);
//  创建字体,字体的大小应该根据图片的高度来定。
  Font font = new Font("Fixedsys", Font.PLAIN, fontHeight);
//  设置字体。
  g.setFont(font);
//  画边框。
  g.setColor(Color.BLACK);
  g.drawRect(0, 0, width - 1, height - 1);
//  随机产生60条干扰线,使图象中的认证码不易被其它程序探测到。
  g.setColor(Color.BLACK);
  for(int i = 0; i < line; i++)
  {
  int x = random.nextInt(width);
  int y = random.nextInt(height);
  int xl = random.nextInt(12);
  int yl = random.nextInt(12);
  g.drawLine(x, y, x + xl, y + yl);
  }
//  randomCode用于保存随机产生的验证码,以便用户登录后进行验证。
  StringBuffer randomCode = new StringBuffer();
  int red = 0, green = 0, blue = 0;
//  随机产生codeCount数字的验证码。
  for (int i = 0; i < codeCount; i++) {
//  得到随机产生的验证码数字。
  String strRand = String.valueOf(codeSequence[random.nextInt(36)]);
//  产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。
  red = random.nextInt(255);
  green = random.nextInt(255);
  blue = random.nextInt(255);
//  用随机产生的颜色将验证码绘制到图像中。
  g.setColor(new Color(red, green, blue));
  g.drawString(strRand, (i + 1) * x, codeY);
//  将产生的四个随机数组合在一起。
  randomCode.append(strRand);
  }
  sessionStr=randomCode.toString();
  
  ImageIO.write(buffImg,"jpeg",os);
}

public String getSessionStr(){
  return sessionStr;
}

public static void main(String[] args) throws IOException{
  ValidateCodeImg vimg=new ValidateCodeImg();
  FileOutputStream os=new FileOutputStream(".\\a.jpg");
  vimg.writeImg(os);
  os.close();
  System.out.println(vimg.getSessionStr());
}

}
验证码图片网页
<%@ page language="java" pageEncoding="ISO-8859-1" import="util.img.*" %>
<%
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg");
ValidateCodeImg img=new ValidateCodeImg();
img.writeImg(response.getOutputStream());
session.setAttribute("ValidateCode",img.getSessionStr());
img=null;
out.clear();
out = pageContext.pushBody();
%>
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表