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

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>
    <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. 效果图

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值