<%@ page contentType="image/jpeg"%>
<%@ page import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*"%>
<%!
//定义产生随机颜色方法
Color getRandColor(int fcolor,int bcolor)
{
Random objrandom=new Random();//生成一个随机数对象
if(fcolor<0||fcolor>255)
{//将前景色控制在0-255的正确颜色值范围内
fcolor=255;
}
if(bcolor<0||bcolor>255)
{//将背景色控制在0-255的正确颜色值范围内
bcolor=255;
}
//产生随机的rgb色值
int r=fcolor+objrandom.nextInt(bcolor-fcolor);
int g=fcolor+objrandom.nextInt(bcolor-fcolor);
int b=fcolor+objrandom.nextInt(bcolor-fcolor);
return new Color(r,g,b);
}
%>
<%
//设置页面不缓存
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires",0);
//在内存中创建图象
int width=60,height=20;
BufferedImage objimage=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics G=objimage.getGraphics();//获取图形上下文
Random random= new Random();//生成随机类
G.setColor(getRandColor(200,250));//调用创建随机色方法设置颜色
G.fillRect(0,0,width,height);//填充画出矩形
G.setFont(new Font( "Times New Roman",Font.PLAIN,18));//设置为生成的18号罗马字体(匿名类字体)
//随机产生50条干扰线,使图象中的验证码不容易被其他程序探测到
G.setColor(getRandColor(160,200));//调用创建随机色方法设置干扰线的颜色
for(int i=0;i<50;i++)
{
int x=random.nextInt(width);//随机产生每条干扰线的起点的横坐标
int y=random.nextInt(height);//随机产生每条干扰线的起点的纵坐标
int xl=random.nextInt(width);//随机产生每条干扰线的宽度
int yl=random.nextInt(height);//随机产生每条干扰线的高度
G.drawLine(x,y,xl,yl);//画出一条干扰线
}
//随机产生的4位数的验证码
String RandNums="";
for(int i=0;i<4;i++)
{
String randNum=String.valueOf(random.nextInt(10));//产生一个随机数
RandNums+=randNum;//累加得到一个4位数的字符串即验证码
//将该验证码显示到图像中
// G.setColor(getRandColor(200,250));//调用创建随机色方法设置验证码的不同颜色
//调用创建随机产生颜色的方法相同,可能是因为随机种子太接近,所以只好直接产生随机色
G.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110) ));
G.drawString(randNum,13*i+6,16);//在图像框的横坐标为13*i+6,纵坐标为16的位置画出一位randNum随机验证码
}
session.setAttribute("CheckCode",RandNums);//将验证码作为会话参数传递登录验证的Servlet页面加以验证
G.dispose();//释放绘图对象
ImageIO.write(objimage,"JPEG",response.getOutputStream());//输出验证码图像到页面
%>