Chinaunix首页 | 论坛 | 博客
  • 博客访问: 167143
  • 博文数量: 16
  • 博客积分: 473
  • 博客等级: 二等列兵
  • 技术积分: 152
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-07 12:58
文章分类

全部博文(16)

文章存档

2012年(8)

2011年(8)

分类: Java

2011-12-16 11:49:47

写好了,没用到~~贴出来。
  1. package org.liushang.action;

  2. import java.awt.Color;
  3. import java.awt.Font;
  4. import java.awt.Graphics;
  5. import java.awt.image.BufferedImage;
  6. import java.io.IOException;
  7. import java.util.Random;

  8. import javax.imageio.ImageIO;
  9. import javax.servlet.ServletException;
  10. import javax.servlet.http.HttpServlet;
  11. import javax.servlet.http.HttpServletRequest;
  12. import javax.servlet.http.HttpServletResponse;
  13. import javax.servlet.http.HttpSession;
  14. /**
  15.  * 生成验证码
  16.  * @author liushang
  17.  *
  18.  */
  19. public class AuthImage extends HttpServlet {

  20.     //根据指定名称、样式和磅值大小,创建一个新 Font。
  21.     //Font.BOLD:粗体样式常量
  22.     //int参数为字体大小
  23.     private Font mFont = new Font("Times New Roman", Font.BOLD, 26);

  24.     Color getRandColor(int fc, int bc) {
  25.         //创建一个随机数生成器
  26.         Random random = new Random();
  27.         if (fc > 255)
  28.             fc = 255;
  29.         if (bc > 255)
  30.             bc = 255;
  31.         int r = fc + random.nextInt(bc - fc);
  32.         int g = fc + random.nextInt(bc - fc);
  33.         int b = fc + random.nextInt(bc - fc);
  34.         return new Color(r, g, b);
  35.     }

  36.     @Override
  37.     protected void service(HttpServletRequest request, HttpServletResponse response)
  38.             throws ServletException, IOException {
  39.         response.setHeader("Pragma", "No-cache");
  40.         response.setHeader("Cache-Control", "no-cache");
  41.         response.setDateHeader("Expires", 0);
  42.         // 表明生成的响应是图片
  43.         response.setContentType("image/jpeg");

  44.         //矩形的宽和高
  45.         int width = 150, height = 40;
  46.         //BufferedImage 子类描述具有可访问图像数据缓冲区的 Image
  47.         //构造一个类型为预定义图像类型之一的 BufferedImage
  48.         //TYPE_INT_RGB:表示一个图像,它具有合成整数像素的 8 位 RGB 颜色分量
  49.         BufferedImage image = new BufferedImage(width, height,
  50.                 BufferedImage.TYPE_INT_RGB);

  51.         //Graphics 类是所有图形上下文的抽象基类,允许应用程序在组件(已经在各种设备上实现)以及闭屏图像上进行绘制。
  52.         Graphics g = image.getGraphics();
  53.         Random random = new Random();
  54.         g.setColor(getRandColor(200, 250));
  55.         // 填充指定的矩形
  56.         g.fillRect(1, 1, width - 1, height - 1);
  57.         g.setColor(new Color(102, 102, 102));
  58.         // 绘制指定矩形的边框
  59.         g.drawRect(0, 0, width - 1, height - 1);
  60.         //将此图形上下文的字体设置为指定字体
  61.         g.setFont(mFont);
  62.         //将此图形上下文的当前颜色设置为指定颜色
  63.         g.setColor(getRandColor(160, 200));

  64.         // 画随机线
  65.         for (int i = 0; i < 155; i++) {
  66.             int x = random.nextInt(width - 1);
  67.             int y = random.nextInt(height - 1);
  68.             int xl = random.nextInt(6) + 1;
  69.             int yl = random.nextInt(12) + 1;
  70.             //在此图形上下文的坐标系中,使用当前颜色在点 (x1, y1) 和 (x2, y2) 之间画一条线
  71.             g.drawLine(x, y, x + xl, y + yl);
  72.         }

  73.         // 从另一方向画随机线
  74.         for (int i = 0; i < 70; i++) {
  75.             int x = random.nextInt(width - 1);
  76.             int y = random.nextInt(height - 1);
  77.             int xl = random.nextInt(12) + 1;
  78.             int yl = random.nextInt(6) + 1;
  79.             g.drawLine(x, y, x - xl, y - yl);
  80.         }

  81.         // 生成随机数,并将随机数字转换为字母
  82.         String sRand = "";
  83.         for (int i = 0; i < 6; i++) {
  84.             //返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值
  85.             int itmp = random.nextInt(26) + 65;
  86.             char ctmp = (char) itmp;
  87.             sRand += String.valueOf(ctmp);
  88.             g.setColor(new Color(20 + random.nextInt(110), 20 + random
  89.                     .nextInt(110), 20 + random.nextInt(110)));
  90.             //使用此图形上下文的当前字体和颜色绘制由指定 string 给定的文本
  91.             //两个int参数分别是(x,y)坐标用于调整字体在矩形中的位置
  92.             g.drawString(String.valueOf(ctmp), 15 * i + 15, 30);
  93.         }

  94.         //返回与当前request对象关联的session,如果没有这个session对象并且参数为true,则返回一个新的session
  95.         HttpSession session = request.getSession(true);
  96.         session.setAttribute("rand", sRand);
  97.         
  98.         //释放此图形的上下文以及它使用的所有系统资源
  99.         g.dispose();
  100.         //getOutputStream():返回一个适合向该response对象写二进制数据的输出流
  101.         //ImageIO.write():(static)使用支持给定格式的任意 ImageWriter 将一个图像写入 OutputStream
  102.         ImageIO.write(image, "JPEG", response.getOutputStream());
  103.     }
  104.     
  105. }

阅读(2347) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~