您的位置:首页 > 其它

JCaptcha开源组件-生成第一个验证码

2013-04-11 09:01 351 查看
1.  介绍
jcaptcha是一个开源的用来生成图形验证码的Java开源组件,不光是可以生成图片式的验证码,还可以生成声音式的(新浪就使用了双重验证码)。
2.      与Spring
JCaptcha尽可能地遵循IOC(Inversion of Control)模式,使其能够为应用程序更加简洁的创建组件.
另一方面,Spring框架也允许通过XML配置文件声明的方式使用JCaptcha组件。所以每一个jCaptcha的单一组件能够通过Spring配置文件定义并且实例化。
3.      
关联包


使用该开源组件时,需要配置以下3个包:

commons-collections-3.2.1.jar

commons-logging-1.1.1.jar

jcaptcha-1.0-all.jar

第3个包是该开源组件的核心包,上面两个包是核心包在运行时需要用到的基本包。

4.      
简单的使用


a.      
调用验证码的index.html


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>验证码生成测试</title>
</head>

<body>
<img src="CaptchaImage" />
</body>
</html>

b.     
配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name>
<servlet>
<servlet-name>Image</servlet-name>
<servlet-class>sample.Image</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>Image</servlet-name>
<url-pattern>/CaptchaImage</url-pattern>
</servlet-mapping>
<welcome-file-list&g
4000
t;
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>

c.      
编写核心包配置类:SimpleCustomImageService.java

package sample;

import java.awt.Color;
import com.octo.captcha.CaptchaFactory;
import com.octo.captcha.component.image.backgroundgenerator.FunkyBackgroundGenerator;
import com.octo.captcha.component.image.color.SingleColorGenerator;
import com.octo.captcha.component.image.fontgenerator.RandomFontGenerator;
import com.octo.captcha.component.image.textpaster.RandomTextPaster;
import com.octo.captcha.component.image.wordtoimage.ComposedWordToImage;
import com.octo.captcha.component.word.wordgenerator.RandomWordGenerator;
import com.octo.captcha.engine.image.gimpy.SimpleListImageCaptchaEngine;
import com.octo.captcha.image.gimpy.GimpyFactory;
import com.octo.captcha.service.captchastore.FastHashMapCaptchaStore;
import com.octo.captcha.service.image.DefaultManageableImageCaptchaService;
import com.octo.captcha.service.image.ImageCaptchaService;
/*************************************************************
*
* 名称:SimpleCustomImageService
* 类型:声明类
* 作用:调用 jcaptcha 包内方法,进行默认初始化。
* 内容:getInstance()方法
*     initializeService()
* 编写:刘武志
* 日期:2013-04-11
*
*************************************************************/
public class SimpleCustomImageService {
private static ImageCaptchaService instance = initializeService();

/**
* 方法名:getInstance()
* 功    能:用于获取 ImageCaptchaService 类型的返回值
* 返回类型:ImageCaptchaService
*
*/
public static ImageCaptchaService getInstance() {
return instance;
}
/**
*
* 方法名:initializeService
* 功    能:该方法用于完成验证码生成的基本设置
* 返回类型:ImageCaptchaService
*
*/
private static ImageCaptchaService initializeService() {
// 设置随机字体大小的范围
RandomFontGenerator fonts = new RandomFontGenerator(new Integer(20),
new Integer(25));
// ***FunkyBackgroundGenerator类,可以设置四种颜色点混合而成的背景***
// 第一个参数是图片宽度
// 第二个参数是图片高度
// 第三至第六个参数分別是图片中,左上,左下,右上,右下四个部分的颜色点的颜色
// 第七个参数是颜色混杂的程度,如:0.5为颜色相互混合的点占一半,最大1.0
// ***设置四个颜色除了可以使用SingleColorGenerator外,
// ***应该也可以使用RandomListColorGenerator类,让每个部分的颜色都不固定
SingleColorGenerator leftUpColor = new SingleColorGenerator(Color.RED);
SingleColorGenerator leftDownColor = new SingleColorGenerator(Color.YELLOW);
SingleColorGenerator rightUpColor = new SingleColorGenerator(Color.BLUE);
SingleColorGenerator rightDownColor = new SingleColorGenerator(Color.GREEN);
FunkyBackgroundGenerator background = new FunkyBackgroundGenerator(200, 100,
leftUpColor, leftDownColor, rightUpColor, rightDownColor, 0.5f);
// 下面被注释掉的方法四利用 FileReaderRandomBackgroundGenerator 进行设置验证码背景图片
// 第一个参数和第二个参数分别表示图片的宽度和高度
// 第三个参数表示图片的文件夹,当你读取文件夹时,会随机取出一张图片作为背景
//		FileReaderRandomBackgroundGenerator background =
//				new FileReaderRandomBackgroundGenerator(
//							 200, 100, "D:\\Program Files\\apache-tomcat-6.0.20\\webapps\\image");

// 设置单词长度,即:单词的位数,第二个是最大能接受字符的个数,最后一个参数是颜色
RandomTextPaster textPaster =
new RandomTextPaster(new Integer(5), new Integer(5), Color.BLUE);
// 组成验证码,第一参数为字体的设置,第二参数为生成的背景,第三参数为设置生成的单词长度
ComposedWordToImage cwti =
new ComposedWordToImage(fonts, background, textPaster);
// 设置随机取词范围,在这一阶段一定要排除难以辨认的字符
RandomWordGenerator words =
new RandomWordGenerator("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
// 设置 GimpyFactory 类,第一个参数为验证码组成,第二参数是随机取词范围
GimpyFactory gimpy = new GimpyFactory(words, cwti);
// 这个类,默认的添加了一种生成文字的工厂类
SimpleListImageCaptchaEngine engine = new SimpleListImageCaptchaEngine();
// 如果直接用add方法来添加,则会保留 SimpleListImageCaptchaEngine 类,默认添加的一个工厂类
engine.setFactories(new CaptchaFactory[] { gimpy });
// 验证码存储器
FastHashMapCaptchaStore captchaStore = new FastHashMapCaptchaStore();
// 创建一个用来生成图片的服务,参数如下:
// 第一个参数是存储器,用来存储生成的文本,最终等待输入验证码后,验证输入是否正确
// 第二个参数是生成图片的引擎
// 第三个参数是最小保证存储的时间,单位是秒
// 第四个参数是最大的存储大小,可能是生成图片最大使用的大小
// 第五个参数是 Captcha 在缓存集合的验证码加载存储数量
DefaultManageableImageCaptchaService defaultService = new
DefaultManageableImageCaptchaService(captchaStore, engine, 180, 100000, 75000);

return defaultService;
}
}


 

d.      
编写Servlet实现类:Image.java

package sample;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.octo.captcha.service.CaptchaServiceException;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

/*************************************************************
*
* 名称:Image
* 类型:实现类
* 作用:实现验证码生成
* 内容:doGet()方法
* 编写:刘武志
* 日期:2013-04-11
*
*************************************************************/

@SuppressWarnings("serial")
public class Image extends HttpServlet {
/**
*
* 方法名:doGet()
* 功    能:接受浏览器以Get方式访问时进行处理
* 注:该方法可自动生成
*
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

byte[] captchaChallengeAsJpeg = null;
// 声明一个 ByteArrayOutputStream 对象,用于接收输出流
ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
try {
// 返回包含分配给 Session 的唯一标识符的字符串
String captchaId = request.getSession().getId();
// 取得单例的 ImageCaptchaService 对象,生成一个 BufferedImage 对象
BufferedImage challenge = SimpleCustomImageService.getInstance()
.getImageChallengeForID(captchaId,request.getLocale());
JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(jpegOutputStream);
// 生成 jpg 格式的验证码图片,存储在 jpegOutputStream 对象中
jpegEncoder.encode(challenge);
} catch (IllegalArgumentException e) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
} catch (CaptchaServiceException e) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
return;
}
// 生成验证码图片的byte数组
captchaChallengeAsJpeg = jpegOutputStream.toByteArray();

// 设置基本响应的格式
response.setHeader("Cache-Control", "no-store");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg");
ServletOutputStream responseOutputStream = response.getOutputStream();
// 写入验证码图片
responseOutputStream.write(captchaChallengeAsJpeg);
responseOutputStream.flush();
responseOutputStream.close();
}
}

 

e. 效果图

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息