轻量级验证码生成插件webutil-licenseImage

时间:2022-12-11 19:46:09

轻量级验证码生成插件webutil-licenseImage源码与实例应用

 

webutil-licenseImage 插件内置4种验证码样式,支持用户扩展.自定义样式实现简单验证码.

源码脱管地址: http://code.google.com/p/licenseimage/

Jar包下载地址: http://files.cnblogs.com/dennisit/licenseimagejar%E5%8C%85%E4%B8%8E%E5%BA%94%E7%94%A8%E8%AF%B4%E6%98%8E.zip

新浪爱问下载地址:http://ishare.iask.sina.com.cn/f/61737762.html

项目结构图:

轻量级验证码生成插件webutil-licenseImage

说明:

ResourceUtil类为获取包内资源服务
LicenseImage用来生成验证码

思路: 通过获取验证码图片资源,创建BufferedImage图片对象,然后获取该对象的Graphics2D操作类,使用Graphics2D绘制背景图,绘制随机生成的字码,绘制干扰线,将结果封装成Map集合,map的key值用来做为session中判断的依据,Map的key为BufferedImage对象,用于展示给前台输出.

核心代码如下:

ResourceUtil类

轻量级验证码生成插件webutil-licenseImage
package org.pudp.util;
import java.net.URL;
import java.net.URLClassLoader;
/**
* 类说明:
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-9-16
*
* org.pudp.util.Resource.java
*
*/
public class ResourceUtil { /**
* 获取资源的URL路径
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-9-16 下午09:33:07
*
* @param paramString
* 验证码图片所在的包的相对路径
* @return
* 验证码所在的URL
*/
public static URL getResourceUrl(String paramString){
return ((URLClassLoader)ResourceUtil.class.getClassLoader()).getResource(paramString);
} /**
* 获取资源的串值路径
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-9-16 下午06:09:17
*
* @param paramString
* 验证码图片所在的包的相对路径
* @return
* 验证码所在的串值地址
*/
public static String getResourcePath(String paramString){
return Thread.currentThread().getContextClassLoader().getResource(paramString).getPath();
} }
轻量级验证码生成插件webutil-licenseImage

生成验证码的核心类

轻量级验证码生成插件webutil-licenseImage
package org.pudp.util.license;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import javax.imageio.ImageIO; import org.pudp.util.ResourceUtil; /**
* 类说明: 验证码工具
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-9-16
*
* org.pudp.util.license.LicenseImage.java
*
*/ public class LicenseImage { public static final Integer TYPE1 = 1; //样式一
public static final Integer TYPE2 = 2; //样式二
public static final Integer TYPE3 = 3; //样式三
public static final Integer TYPE4 = 4; //样式四 public static final int DEF_NUM = 4; //验证码上的字符个数
public static final int DEF_LINES = 3; //干扰线条数
public static final int DEF_WIDTH = 150; //验证码图片宽
public static final int DEF_HEIGHT = 50; //验证码图片高
public static final int DEF_FONT_SIZE = 24; //验证码上字体大小 private int num; //验证码上的字符个数
private int width ; //验证码图片宽
private int height ; //验证码图片高
private int fontSize ; //验证码上字体大小
private int lines ; //干扰线条数 private static final String[] chars = { "0", "1", "2", "3", "4", "5", "6",
"7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I" }; public LicenseImage(){
this(DEF_WIDTH, DEF_HEIGHT, DEF_FONT_SIZE, DEF_NUM, DEF_LINES);
} /**
* 自定义验证码的宽度与高度
* @param width
* 验证码的宽度
* @param height
* 验证码的高度
*/
public LicenseImage(int width,int height){
if(width<0 || height<0){
this.width = LicenseImage.DEF_WIDTH;
this.height = LicenseImage.DEF_HEIGHT;
}else{
this.width = width;
this.height = height;
}
this.num = LicenseImage.DEF_NUM;
this.fontSize = LicenseImage.DEF_FONT_SIZE;
this.lines = LicenseImage.DEF_LINES;
} /**
* 自定义验证码的宽度和高度,以及字体大小
* @param width
* 验证码的宽度
* @param height
* 验证码的高度
* @param fontSize
* 验证码字体大小
*/
public LicenseImage(int width,int height,int fontSize){
this(width, height);
this.fontSize = fontSize;
this.num = LicenseImage.DEF_NUM;
this.lines = LicenseImage.DEF_LINES;
} /**
* 自定义验证码的宽度和高度,以及字体大小
* @param width
* 验证码的宽度
* @param height
* 验证码的高度
* @param fontSize
* 验证码字体大小
*
* @param size
* 验证码上字体个数
*/
public LicenseImage(int width,int height,int fontSize,int num){
this(width, height,fontSize);
if(num <0){
this.num = LicenseImage.DEF_NUM;
}else{
this.num = num;
} this.lines = LicenseImage.DEF_LINES;
} /**
* 自定义验证码的宽度和高度,以及字体大小
* @param width
* 验证码的宽度
* @param height
* 验证码的高度
* @param fontSize
* 验证码字体大小
* @param size
* 验证码上字体个数
*
* @param lines
* 验证码上的干扰线条数目
*/ public LicenseImage(int width,int height,int fontSize,int num,int lines){
this(width, height,fontSize,num);
this.lines = lines;
} /**
*
* 生成验证码,验证码图片由用户自己定义
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-9-16 下午08:13:53
*
* @param backgroundPath
* 用户自定义的验证码的背景图片
* @return
* 验证码生成后的封装对象
*/
public Map<String,BufferedImage> createImage(String backgroundPath){
//保存产生验证码真实值的串
StringBuffer buffer = new StringBuffer();
//自定义图片对象
BufferedImage image = new BufferedImage(this.width,this.height,BufferedImage.TYPE_INT_RGB);
Map<String,BufferedImage> map = new HashMap<String,BufferedImage>();
Graphics2D graphics = (Graphics2D) image.createGraphics();
graphics.setColor(Color.WHITE);
// 初始化背景图片
try {
Image bgImage = ImageIO.read(ResourceUtil.getResourceUrl(backgroundPath));
graphics.drawImage(bgImage,0,0,this.width,this.height,null);
} catch (IOException e) {
e.printStackTrace();
} Random random = new Random();
//画随机字符
for(int i=0; i<this.num; i++){
//随即获取定义字符集中的一个元素
int rand = random.nextInt(chars.length);
graphics.setColor(randomColor());
graphics.setFont(new Font("Times New Roman",Font.BOLD+Font.ITALIC,this.fontSize));
/** **随机缩放文字并将文字旋转指定角度* start*/
Graphics2D g2d_word = (Graphics2D) graphics;
AffineTransform trans = new AffineTransform();
trans.rotate(random.nextInt(10) * 3.14 / 90, 13 * i + 8, 7);
// 缩放文字
float scaleSize = random.nextFloat() +0.8f;
if (scaleSize > 1f){
scaleSize = 1f;
}
trans.scale(scaleSize, scaleSize);
g2d_word.setTransform(trans);
/** **随机缩放文字并将文字旋转指定角度* end*/
graphics.drawString(chars[rand],(this.num*2)+(i)*this.width/this.num , this.height/2);
buffer.append(chars[rand]); //将生成的字符串存入到buffer中,将来获取时用于跟用户输入的值比较
}
//画干扰线
for(int i=1;i<=this.lines;i++){
graphics.setColor(randomColor());
graphics.drawLine(random.nextInt(this.width), random.nextInt(this.height),
random.nextInt(this.width),random.nextInt(this.height));
if(i==this.lines){
Font font = new Font("Times New Roman",Font.PLAIN, this.fontSize-5);
graphics.setFont(font);
graphics.setColor(Color.GRAY);
}
}
//画一条折线
/*
BasicStroke bs=new BasicStroke(2f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); //创建一个供画笔选择线条粗细的对象
graphics.setStroke(bs); //改变线条的粗细
graphics.setColor(randomColor()); //设置当前颜色为预定义颜色中的深灰色
int[] xPoints=new int[3];
int[] yPoints=new int[3];
for(int j=0;j<3;j++){
xPoints[j]=random.nextInt(WIDTH - 1);
yPoints[j]=random.nextInt(HEIGHT - 1);
}
graphics.drawPolyline(xPoints, yPoints,3);
*/
map.put(buffer.toString(), image);
return map;
} /**
*
* 使用系统默认样式
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-9-16 下午08:06:22
*
* @param type
* 工具内置的类型,用户使用该类型即可用内置的样式生成验证码
* @return
* Map<验证码的值,验证码的图片>
*/
public Map<String,BufferedImage> createImage(int type){
return createImage("org/pudp/util/license/resources/yzm"+type+".gif");
} /**
* 随即产生颜色
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-9-16 下午08:04:08
*
* @return
* <code>Color对象</code>
*/
public static Color randomColor(){
Random random = new Random();
Color color = new Color(random.nextInt(256),random.nextInt(256),random.nextInt(256));
return color;
} }
轻量级验证码生成插件webutil-licenseImage

实例应用

创建servlet类

轻量级验证码生成插件webutil-licenseImage
    public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 禁止图像缓存。
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg"); //使用验证码工具生成验证码
LicenseImage licenseImage = new LicenseImage();
//使用验证码工具内置样式
Map<String,BufferedImage> licenseImg = licenseImage.createImage(LicenseImage.TYPE1);
//获取map集合中的值
String key = (String)licenseImg.keySet().iterator().next();
//将验证码的key放入session中
//SessionUtil.session(request).setAttribute(CommonConstant.LicenseImageKey, key);
System.out.println("session中的验证码值为:" + key);
//获取map集合中的图片对象
BufferedImage buffImg = licenseImg.get(key);
ServletOutputStream out = response.getOutputStream();
ImageIO.write(buffImg, "jpeg", out);
out.close();
}
轻量级验证码生成插件webutil-licenseImage

内置样式一效果图
轻量级验证码生成插件webutil-licenseImage

使用工具内置的样式生成验证码代码,licenseImage.createImage(int type)方法,传递系统内置的4种样式即可生成验证码

        //使用验证码工具生成验证码
LicenseImage licenseImage = new LicenseImage();
//使用验证码工具内置样式
Map<String,BufferedImage> licenseImg = licenseImage.createImage(LicenseImage.TYPE1);

系统后台为我们打印出了session中存放的验证码的串值如下:

轻量级验证码生成插件webutil-licenseImage

开发者自定义验证码,构造自定义参数说明如下

/**
* 自定义验证码的宽度与高度
* @param width
* 验证码的宽度
* @param height
* 验证码的高度
*/
public LicenseImage(int width,int height){
this.width = width;
this.height = height;
this.num = LicenseImage.DEF_NUM;
this.fontSize = LicenseImage.DEF_FONT_SIZE;
this.lines = LicenseImage.DEF_LINES;
}

/**
* 自定义验证码的宽度和高度,以及字体大小
* @param width
* 验证码的宽度
* @param height
* 验证码的高度
* @param fontSize
* 验证码字体大小
*/
public LicenseImage(int width,int height,int fontSize){
this(width, height);
this.fontSize = fontSize;
this.num = LicenseImage.DEF_NUM;
this.lines = LicenseImage.DEF_LINES;
}

/**
* 自定义验证码的宽度和高度,以及字体大小
* @param width
* 验证码的宽度
* @param height
* 验证码的高度
* @param fontSize
* 验证码字体大小
*
* @param size
* 验证码上字体个数
*/
public LicenseImage(int width,int height,int fontSize,int num){
this(width, height,fontSize);
this.num = num;
this.lines = LicenseImage.DEF_LINES;
}

/**
* 自定义验证码的宽度和高度,以及字体大小
* @param width
* 验证码的宽度
* @param height
* 验证码的高度
* @param fontSize
* 验证码字体大小
* @param size
* 验证码上字体个数
*
* @param lines
* 验证码上的干扰线条数目
*/

public LicenseImage(int width,int height,int fontSize,int num,int lines){
this(width, height,fontSize,num);
this.lines = lines;
}

自定义实例应用

//使用验证码工具提供的构造参数自定义相应的参数值
LicenseImage licenseImage = new LicenseImage(120,50,18,5,5);
//指定自定义背景包内的相对路径
Map<String,BufferedImage> licenseImg = licenseImage.createImage("definebk.png");

如果自定义图片在com.define包下,传递的串值参数为

    Map<String,BufferedImage> licenseImg = licenseImage.createImage("com/define/definebk.png");

自定义实例效果图
轻量级验证码生成插件webutil-licenseImage

转载请注明出处:[http://www.cnblogs.com/dennisit/p/3325871.html]

热爱生活,热爱Coding,敢于挑战,用于探索 ...
 
分类: JavaEE

轻量级验证码生成插件webutil-licenseImage的更多相关文章

  1. 轻量级验证码生成插件webutil-licenseImage源码与实例应用

    webutil-licenseImage 插件内置4种验证码样式,支持用户扩展.自定义样式实现简单验证码. 源码脱管地址: http://code.google.com/p/licenseimage/ ...

  2. 一个基于原生JavaScript开发的、轻量的验证码生成插件

    Vcode.js 一个基于原生JavaScript开发的.轻量的验证码生成插件 V: 1.0.0 DEMO:https://jofunliang.github.io/Vcode.js/example. ...

  3. captcha&period;js一个生成验证码的插件,使用js和canvas生成

    一.captcha`captcha.js`是一个生成验证码的插件,使用js和canvas生成的,确保后端服务被暴力攻击,简单判断人机以及系统的安全性,体积小,功能多,支持配置. 验证码插件内容,包含1 ...

  4. 即使用ADO&period;NET,也要轻量级动态生成更新SQL,比Ormlite性能更高

    先上测试结果: //测试1000次针对同一个表同一个字段更新,比Ormlite平均快2.34倍 //生成SQL+ExecuteNonQuery Ormlite 倍数 //6513ms 15158ms ...

  5. php 图片验证码生成 前后台验证

    自己从前一段时间做了个php小项目,关于生成图片验证码生成和后台的验证,把自己用到的东西总结一下,希望大家在用到相关问题的时候可以有一定的参考性. 首先,php验证码生成. 代码如下: 1.生成图像代 ...

  6. Atitit 图片 验证码生成attilax总结

    Atitit 图片 验证码生成attilax总结 1.1. 图片验证码总结1 1.2. 镂空文字  打散 干扰线 文字扭曲 粘连2 1.1. 图片验证码总结 因此,CAPTCHA在图片验证码这一应用点 ...

  7. ASP&period;NET验证码生成与识别

    一般验证码页面只输出一个图片而不进行其他业务处理,所以验证码一般放在一般处理程序(httpHandler)页面中,而如果将验证码生成代码放到一般处理程序中,要将生成验证码保存在Session中,这里我 ...

  8. ajax原理,验证码生成原理

    什么是ajax AJAX:”Asynchronous JavaScript and XML” 中文意思:异步JavaScript和XML 指一种创建交互式网页应用的网页开发技术.   不是指一种单一的 ...

  9. &period;net验证码生成及使用

    验证码的作用: 几年前,大部分网站.论坛之类的是没有验证码的,因为对于一般用户来说验证码只是增加了用户的操作,降低了用户的体验.但是后来各种灌水机器人.投票机器人.恶意注册机器人层出不穷,大大增加了网 ...

随机推荐

  1. php每天一题:strlen&lpar;&rpar;与mb&lowbar;strlen&lpar;&rpar;的作用分别是什么

    strlen()与mb_strlen()都是用于获取字符串长度的,那么它们两个有什么不同? strlen()与mb_strlen()的不同之处在于mb_strlen()第二个参数可以用于指定字符编码. ...

  2. codeforces 258div2 A Game With Sticks&lpar;DP&rpar;

    题目链接:http://codeforces.com/contest/451/problem/A 解题报告:有n跟红色的棍子横着放,m根蓝色的棍子竖着放,它们形成n*m个交点,两个人轮流在里面选择交点 ...

  3. Oracle表变化趋势追踪记录

    #DBA_HIST_SEG_STAT可以看出对象的使用趋势,构造如下SQL查询出每个时间段内数据库对象的增长量,其中DB_BLOCK_CHANGES_DELTA为块个数 select c.SNAP_I ...

  4. LuaFileSystem学习心得

    LuaFileSystem(简称lfs)是一个用于lua进行文件訪问的库,和Lua版本号同步.且是跨平台的,在为lua安装lfs之前须要先安装luarocks, luarocks是一个用于安装lua库 ...

  5. linux下so动态库一些不为人知的秘密&lpar;转&rpar;

    linux 下有动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名.二者都使用广泛.本文主要讲动态库方面知识.基本上每一个linux 程序都至少会有一个动态库,查看某个程序使用了那些动态库, ...

  6. java selenium webdriver实战 seleniumIDE

    Selenium是ThoughtWorks公司,一个名为Jason Huggins的测试为了减少手工测试的工作量,自己实现的一套基于Javascript语言的代码库 使用这套库可以进行页面的交互操作, ...

  7. C&plus;&plus;学习-7

    1.面向过程是:数据与操作分离,数据容易被意外修改 2.面向过程通过私有化的权限进行数据封装 3.类型后辍:类名 operator "" _XXXX(int data)  增加后缀 ...

  8. react-quill 富文本编辑器 ---- 图片处理

    import React,{Component} from 'react'; import ReactQuill,{ Quill } from 'react-quill'; import 'react ...

  9. 性能测试 基于Python结合InfluxDB及Grafana图表实时采集Linux多主机或Docker容器性能数据

    基于Python结合InfluxDB及Grafana图表实时采集Linux多主机性能数据   by:授客 QQ:1033553122 实现功能 1 测试环境 1 环境搭建 3 使用前提 3 使用方法 ...

  10. 张量系列-Tensor&lpar;01&rpar;

    张量——N-dim 数组 1. 数组的创建 2. 符号数组的创建 3. 一维数组改变形状创建 4. 切片操作 5. 符号数组操作 6. 数组转化为列表 7. 维度为2的数组可以转化为矩阵