千里马

天马行空

生成图形的缩略图和动态的图形的验证码

1,缩略图是当今web站点,尤其是提供图片信息浏览功能的网站,都会使用到的技术,它能够有效的提高用户浏览信息的速度。
2,缩略图与原图的本质区别是文件大小骤减,对于浏览型的图片来说,缩略图就是在不失去原有的浏览效果的前提下提高浏览速度的作用。
3,      
    ... 
          response.setContentType("image/jpeg");
           FileInputStream fin=new FileInputStream("E:\\Users\\lizi\\Workspaces\\MyEclipse 8.5\\JSPTest\\src\\javal.jpg");
           Image src=ImageIO.read(fin);
           int h=60;
           int w=60;
           BufferedImage tag=new BufferedImage(w, h,BufferedImage.TYPE_INT_RGB);
           tag.getGraphics().drawImage(src, 0, 0, w, h, null);
           ImageIO.write(tag, "JPEG", response.getOutputStream());
    ...
4,图形验证码是为了防止恶意注册和登录而设计的。有些恶意程序(如注册机)可以进行不断的注册和登录尝试。如果没有图形验证码,web服务器会不堪重负,有时还会短时间内占满服务器的磁盘空间。图形验证码可以很好的解决这类问题,因为随机的验证码是以图形的方式呈现给用户的,还包含了一些干扰点,只能肉眼才能看清楚验证码的值。
5,图形验证码的原理其实很简单,在用户注册或登录前,生成一个随机的验证码并保存在会话session中,用户提交请求以后,首先验证输入的验证码是否正确,如果错误则直接返回。所以图形验证码的核心在于如何使用java的2D图形编程API来绘制生成的验证码和干扰点,然后再把生成的图片对象写到客户端。
以下是使用动态图形验证码的基本步骤:
   (1)创建一个图形对象。一般还要初始化背景颜色和边框。
   int width=60,height=20;//定义宽度和高度
    //在内存中创建图像
   BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
   Graphics g=image.getGraphics();//获取图形上下文
   g.setClor(new Color(0xDCDCDC));
   g.fillRect(0,0,width,height);
   g.setColr(Color.black);
   g.drawRect(0,0,width-1,height-1);
   (2)产生随机数字。如果位数不足还需补零,以下是生成4位长度的随机数字示例代码:
 //取随机产生的验证码(4位)
 
    //设置返回内容的MIME类型,这里是jpeg图片。
  response.setContentType("image/jpeg");
  //为了保证每次的验证码每次访问都是新的,需要指定验证码图片不从浏览器缓存里获得。
  response.setHeader("Cache-Control","no-cache,nust-revalidate");
  response.setHeader("Pragma", "no-cache");
  response.setHeader("Last-Modified", new  Date().toString());
  response.setDateHeader("Expires",0);
  //在内存中创建图像。
  int width=60,height=20;
  BufferedImage image=new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
  Graphics g=image.getGraphics();
  //设定背景色
  g.setColor(new Color(0xDCDCDC));
  g.fillRect(0, 0, width, height);
  //画边框
  g.setColor(Color.black);
  g.drawRect(0, 0, width-1, height-1);
  //随机产生的验证码(4位数),小于4位的的前面补零。
  Random r=new Random();
  int rst=0;
  while((rst=r.nextInt(10000))<0){
   
  }
  String rand=rst+"";
  switch (rand.length()) {
  case 1:
   rand="000"+rand;
   break;
  case 2:
   rand="00"+rand;
   break;
  case 3:
   rand="0"+rand;
   break;
  default:
   rand=rand.substring(0, 4);
   break;
  }
  //将验证码存入session
  request.getSession().setAttribute("rand",rand);
     // 将验证码显示到图像中
  g.setColor(Color.red);
  g.setFont(new Font("Atlantic Inline",Font.PLAIN,18));
  g.drawString(rand.charAt(0)+"",8 ,17);
  g.drawString(rand.charAt(1)+"", 20, 15);
  g.drawString(rand.charAt(2)+"", 35,18 );
  g.drawString(rand.charAt(3)+"",45, 15);
  //随机产生50个干扰点,使图像中的验证码不已被其他程序探测到
  Random random=new Random();
  for (int i = 0; i < 1500; i++) {
   int x=random.nextInt(width);
   int y=random.nextInt(width);
   g.drawOval(x, y, 0, 0);
  }
  g.dispose();//图形生效
  //输出图形到页面
  ImageIO.write(image, "JPEG", response.getOutputStream());

posted on 2012-05-30 18:32 Mr Lee 阅读(535) 评论(0)  编辑  收藏 所属分类: java技术


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


网站导航:
 

My Links

Blog Stats

常用链接

留言簿

随笔分类

随笔档案

文章档案

(hibernate)http://www.blogjava.net/dyllove98/archive/2012/05/12/377959.html

搜索

最新评论

阅读排行榜

评论排行榜