用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类可以生成更复杂的验证码,朋友们可以自己试一试!

时间: 2024-12-28 15:13:26

用java Graphics生成验证码的相关文章

java自动生成验证码

代码结构: web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="

java动态生成验证码图片

package cn.lijun.checkimg; import java.awt.image.BufferedImage;import java.io.BufferedReader; import java.awt.Color;import java.io.FileReader;import java.io.IOException;import java.util.ArrayList;import java.util.List;import java.util.Random; import

java Zing生成验证码

package yanzm; import java.awt.image.BufferedImage;  import java.io.File;  import java.io.IOException;  import java.nio.file.FileSystems;  import java.nio.file.Path;  import java.util.HashMap;  import java.util.Map;  import javax.imageio.ImageIO;  im

java生成验证码

一:需求分析 使用java生成验证码: 1:生成画布,画好背景图 2:画随机数 3:画干扰线 4:将内存中的图片保存到硬盘上 二:代码如下 1 /** 2 * 3 */ 4 package com.hlcui.io; 5 6 import java.awt.Color; 7 import java.awt.Font; 8 import java.awt.Graphics; 9 import java.awt.image.BufferedImage; 10 import java.io.File;

Java生成验证码_转

为了防止用户恶意,或者使用软件外挂提交一些内容,就得用验证码来阻止,虽然这个会影响用户体验,但为了避免一些问题很多网站都使用了验证码;今天下午参考文档弄了一个验证码,这里分享一下;这是一个web工程,首先是页面,这里只是一个显示验证码页面index.jsp,使用默认生成的就可以了,表单没有做提交,如下 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

java生成验证码图片

public class AuthImg extends HttpServlet { /** * */ private static final long serialVersionUID = 4975974534946437434L; // 设置图形验证码字符串的字体和大小 private Font mFont = new Font("微软雅黑", Font.ITALIC, 18); private Random random = new Random(); public void

JAVA WEB项目中生成验证码及验证实例(附源码及目录结构)

[我是一个初学者,自己总结和网上搜索资料,代码是自己敲了一遍,亲测有效,现将所有的目录结构和代码贴出来分享给像我一样的初学者] 作用 验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计算机的公共全自动程序,这个问题可以由计算机生成并评判,但是必须只有人类才能解答.可以防止恶意破解密码.刷票.论坛灌水.有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登录. 原理 在servlet中随机生成一个指定位置的验证码,一般为四位,然后把该验证码保存到session中.在

JAVA中的验证码生成

生成验证码的工具类:VerifyCodeUtils(有几种实现方式,放入流,保存文件等) public class VerifyCodeUtils { //使用到Algerian字体,系统里没有的话需要安装字体,字体只显示大写,去掉了1,0,i,o几个容易混淆的字符 public static final String VERIFY_CODES = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ"; private static Random random = ne

java实现生成简单图片验证码

原文:java实现生成简单图片验证码 源代码下载地址:http://www.zuidaima.com/share/1550463428840448.htm 项目载图: 该项目要转换为Dynamic web project http://www.zuidaima.com/blog/1618162161323008.htm 另外缺少jar包: http://www.zuidaima.com/jar/search/jstl-1.0.1.htm http://www.zuidaima.com/jar/s