JSP实现页面验证功能随机生成图片

 

<%@ 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());//输出验证码图像到页面
    %>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莫欺少年穷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值