用java Graphics生成验证码
以下下是API文档对Graphics的介绍!
Graphics 类是所有图形上下文的抽象基类,允许应用程序在组件(已经在各种设备上实现)以及闭屏图像上进行绘制。
Graphics 对象封装了 Java 支持的基本呈现操作所需的状态信息。此状态信息包括以下属性:
- 要在其上绘制的
Component对象。 - 呈现和剪贴坐标的转换原点。
- 当前剪贴区。
- 当前颜色。
- 当前字体。
- 当前逻辑像素操作函数(XOR 或 Paint)。
- 当前 XOR 交替颜色(参见
setXORMode(java.awt.Color))。
坐标是无限细分的,并且位于输出设备的像素之间。绘制图形轮廓的操作是通过使用像素大小的画笔遍历像素间无限细分路径的操作,画笔从路径上的锚点向下和向右绘制。填充图形的操作是填充图形内部区域无限细分路径操作。呈现水平文本的操作是呈现字符字形完全位于基线坐标之上的上升部分。
图形画笔从要遍历的路径向下和向右绘制。其含义如下:
- 如果绘制一个覆盖给定矩形的图形,那么该图形与填充被相同矩形所限定的图形相比,在右侧和底边多占用一行像素。
- 如果沿着与一行文本基线相同的 y 坐标绘制一条水平线,那么除了文字的所有下降部分外,该线完全画在文本的下面。
所有作为此 Graphics 对象方法的参数而出现的坐标,都是相对于调用该方法前的此 Graphics 对象转换原点的。
所有呈现操作仅修改当前剪贴区所限定区域内的像素,此剪贴区是由用户空间中的 Shape 指定的,并通过使用 Graphics 对象的程序来控制。此用户剪贴区 被转换到设备空间中,并与设备剪贴区 组合,后者是通过窗口可见性和设备范围定义的。用户剪贴区和设备剪贴区的组合定义复合剪贴区,复合剪贴区确定最终的剪贴区域。用户剪贴区不能由呈现系统修改,以反映得到的复合剪贴区。用户剪贴区只能通过 setClip 或 clipRect 方法更改。所有的绘制或写入都以当前的颜色、当前绘图模式和当前字体完成。
图形验证码多用于网页上用户验证以防止非注册用户使用暴力破解法获取密码或者批量注册!用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类可以生成更复杂的验证码,朋友们可以自己试一试!
用java Graphics生成验证码的更多相关文章
- java中生成验证码,以及验证码的使用
java中生成验证码,以及验证码的使用: 1:验证码生成工具类: import java.awt.Color; import java.awt.Font; import java.awt.Graphi ...
- Java基础--生成验证码
HTML <%@ page language="java" contentType="text/html; charset=UTF-8" pageEnco ...
- java随机生成验证码
package com.yuyuchen.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; im ...
- java动态生成验证码图片
package cn.lijun.checkimg; import java.awt.image.BufferedImage;import java.io.BufferedReader; import ...
- Java生成验证码原理(jsp)
验证码的作用: 验证码是Completely Automated Public Turing test to tell Computers and Humans Apart(全自动区分计算机和人类的 ...
- java生成验证码结合springMVC
在用户登录的时候,为了防止机器人攻击都会设置输入验证码,本篇文章就是介绍java如何生成验证码并使用在springMVC项目中的. 第一步:引入生成图片验证码的工具类 import java.awt. ...
- java web学习总结(九) -------------------通过Servlet生成验证码图片
一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:
- java web 学习九(通过servlet生成验证码图片)
一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:
- java web,生成验证码图片的技术
偶然知道原来有些网站的验证码图片都是随机生成的,后来听人讲了一下,就做了这个小例子 生成图片,绘制背景,数字,干扰线用到了java.awt包,主要使用BufferedImage来生成图片,然后使用Gr ...
随机推荐
- 292. Nim游戏
292. Nim游戏 class Solution(object): def canWinNim(self, n): """ :type n: int :rtype: b ...
- Elasticsearch之探索集群信息
REST API 启动并运行了节点和集群,下一步是了解如何与它进行通信.elasticsearch提供了一个非常全面和强大的REST API,可以使用它与集群进行交付. 使用API完成以下: • 检查 ...
- Maven + Docker
一.设置POM.xml <build> <finalName>ROOT</finalName> <plugins> <plugin> < ...
- jQuery addClass() 源码解读
addClass: function( value ) { var classes, elem, cur, clazz, j, i = 0, len = this.length, proceed = ...
- winform 更新服务器程序
感谢csdn jekytan 的共享 http://download.csdn.net/detail/jekytan/4242666 本地xml文件 <?xml version="1. ...
- [转]SqlServer索引的原理与应用
索引的概念 索引的用途:我们对数据查询及处理速度已成为衡量应用系统成败的标准,而采用索引来加快数据处理速度通常是最普遍采用的优化方法. 索引是什么:数据库中的索引类似于一本书的目录,在一本书中使用目录 ...
- 【读书笔记】构建之法(CH1~CH3)
人类文明的发展离不开哲学家的思考.科学家的发现和工程师的构建.三个简单的方程式解释了什么是现代软件工程: 1.程序=算法+数据结构 2.软件=程序+软件工程 3.软件企业=软件+商业模式 软件开发的不 ...
- Java多态的应用
//多态的应用 class Animal{ public void eat(){ } } class Dog extends Animal{ public void eat() ...
- Selenium私房菜系列9 -- Selenium RC服务器命令行参数列表【ZZ】
本文转载自:http://wiki.javascud.org/display/SEL/Selenium+Remote+Control+-+options 使用示例: java -jar seleniu ...
- MySQL 导出一句话
听说是很老的东西了,学习的时候发现还是很好用的,故学习转载过来,留备学习. mysql 导出一句话 方法1:网上流行的方法 流程:(1)建表--->(2)插入数据--->(3)select ...