用java Graphics生成验证码

时间:2023-03-08 21:27:04
用java Graphics生成验证码

以下下是API文档对Graphics的介绍!

Graphics 类是所有图形上下文的抽象基类,允许应用程序在组件(已经在各种设备上实现)以及闭屏图像上进行绘制。

Graphics 对象封装了 Java 支持的基本呈现操作所需的状态信息。此状态信息包括以下属性:

  • 要在其上绘制的 Component 对象。
  • 呈现和剪贴坐标的转换原点。
  • 当前剪贴区。
  • 当前颜色。
  • 当前字体。
  • 当前逻辑像素操作函数(XOR 或 Paint)。
  • 当前 XOR 交替颜色(参见 setXORMode(java.awt.Color))。

坐标是无限细分的,并且位于输出设备的像素之间。绘制图形轮廓的操作是通过使用像素大小的画笔遍历像素间无限细分路径的操作,画笔从路径上的锚点向下和向右绘制。填充图形的操作是填充图形内部区域无限细分路径操作。呈现水平文本的操作是呈现字符字形完全位于基线坐标之上的上升部分。

图形画笔从要遍历的路径向下和向右绘制。其含义如下:

  • 如果绘制一个覆盖给定矩形的图形,那么该图形与填充被相同矩形所限定的图形相比,在右侧和底边多占用一行像素。
  • 如果沿着与一行文本基线相同的 y 坐标绘制一条水平线,那么除了文字的所有下降部分外,该线完全画在文本的下面。

所有作为此 Graphics 对象方法的参数而出现的坐标,都是相对于调用该方法前的此 Graphics 对象转换原点的。

所有呈现操作仅修改当前剪贴区所限定区域内的像素,此剪贴区是由用户空间中的 Shape 指定的,并通过使用 Graphics 对象的程序来控制。此用户剪贴区 被转换到设备空间中,并与设备剪贴区 组合,后者是通过窗口可见性和设备范围定义的。用户剪贴区和设备剪贴区的组合定义复合剪贴区,复合剪贴区确定最终的剪贴区域。用户剪贴区不能由呈现系统修改,以反映得到的复合剪贴区。用户剪贴区只能通过 setClipclipRect 方法更改。所有的绘制或写入都以当前的颜色、当前绘图模式和当前字体完成。

图形验证码多用于网页上用户验证以防止非注册用户使用暴力破解法获取密码或者批量注册!用java Graphics生成图形验证码还是非常简单的下面我们看一下代码!

主要代码是放在servlet的GEt方法中的

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

response.setContentType("image/jpeg");
HttpSession session = request.getSession();
int width =100;
int height=40;
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
//创建内存图像并获得其图形上下文
BufferedImage image =new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
//产生随机码
//定义随机码的字符表
String chars="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char[] rands = new char[4];
for(int i=0;i<4;i++){
int rand =(int)(Math.random()*36);
rands[i] =chars.charAt(rand);

//产生 图像
//画出背景

}

g.setColor(new Color(0xDCDCDC));
g.fillRect(0, 0, width, height);
for(int i=0;i<500;i++){
int x=(int)(Math.random()*width);
int y=(int)(Math.random()*height);
int red=(int)(Math.random()*255);
int green=(int)(Math.random()*255);
int blue=(int)(Math.random()*255);
g.setColor(new Color(red,green,blue));
g.drawOval(x, y, 1, 0);
}
g.setColor(Color.BLACK);
g.setFont(new Font(null,Font.ITALIC,30));
//在不同高度上输出验证码的不同字符
g.drawChars(rands, 0, 1, 1, 35);
g.drawChars(rands,1,1, 24, 30);
g.drawChars(rands,2,1, 42, 25);
g.drawChars(rands,3,1, 57, 32);
//g.drawChars(rands,4,1, 61, 19);
//g.drawChars(rands,5,1, 76, 22);
g.dispose();
//将图像输出到客户端
ServletOutputStream sos = response.getOutputStream();
ByteArrayOutputStream baos =new ByteArrayOutputStream();
ImageIO.write(image,"JPEG",baos);
byte[] buffer = baos.toByteArray();
response.setContentLength(buffer.length);
sos.write(buffer);
baos.close();
sos.close();
//将验证码放到 session 中
session.setAttribute("checkCode", new String(rands));
}

这个只是众多生成验证码方法中的其中一种,而且相对简单!其实利用Graphics类可以生成更复杂的验证码,朋友们可以自己试一试!