本文章摘编、转载需要注明来源 http://write.blog.csdn.net/postedit/8575471
对于验证码的各个插件大家都应该熟悉不少了,但是我比较喜欢用jcaptcha这个插件,下面我演示自己的扩展使用
我使用的是DefaultManageableImageCaptchaService实现类根据源码的实现类改编过来的,至于其他的实现类有兴趣的可以自己去看下文档
然后就开始写我们的扩展类ImageCaptchaEngineExtend,该类要继承ListImageCaptchaEngine
/**
* 自定义验证码内容样式
*
* @author shadow
* @email [email protected]
*/
public class ImageCaptchaEngineExtend extends ListImageCaptchaEngine {
protected void buildInitialFactories() {
// build filters
WaterFilter water = new WaterFilter();
water.setAmplitude(3d);
water.setAntialias(true);
water.setPhase(20d);
water.setWavelength(70d);
ImageDeformation backDef = new ImageDeformationByFilters(
new ImageFilter[] {});
ImageDeformation textDef = new ImageDeformationByFilters(
new ImageFilter[] {});
ImageDeformation postDef = new ImageDeformationByFilters(
new ImageFilter[] { water });
// word generator
WordGenerator dictionnaryWords = new RandomWordGenerator(
"abcdefhjkmnprstuvwxyz23456789");
// wordtoimage components
RandomRangeColorGenerator colors = new RandomRangeColorGenerator(
new int[] { 0, 150 }, new int[] { 0, 150 },
new int[] { 0, 150 });
// Arial,Tahoma,Verdana,Helvetica,宋体,黑体,幼圆
Font[] fonts = new Font[] { new Font("Arial", 0, 15),
new Font("Tahoma", 0, 15), new Font("Verdana", 0, 15),
new Font("Helvetica", 0, 15), new Font("宋体", 0, 15),
new Font("黑体", 0, 15), new Font("幼圆", 0, 15) };
// 设置字符以及干扰线
RandomRangeColorGenerator lineColors = new RandomRangeColorGenerator(
new int[] { 150, 255 }, new int[] { 150, 255 }, new int[] {
150, 255 });
TextPaster randomPaster = new DecoratedRandomTextPaster(new Integer(4),
new Integer(4), colors, true,
new TextDecorator[] { new LineTextDecorator(new Integer(1),
lineColors) });
BackgroundGenerator back = new UniColorBackgroundGenerator(new Integer(
140), new Integer(45), Color.white);
FontGenerator shearedFont = new RandomFontGenerator(new Integer(30),
new Integer(0), fonts);
// word2image 1
WordToImage word2image;
word2image = new DeformedComposedWordToImage(shearedFont, back,
randomPaster, backDef, textDef, postDef);
this.addFactory(new GimpyFactory(dictionnaryWords, word2image));
}
}
然后写个单例调用我们的实现类
/**
* Jcaptcha单例模式
*
* @author shadow
* @email [email protected]
* @create 2012.04.28
*/
public class CaptchaServiceSingleton {
// 不允许构造实例
private CaptchaServiceSingleton() {
}
private static ImageCaptchaService instance = null;
/**
* SimpleListSoundCaptchaEngine //还可以用声音 SpellerSoundCaptchaEngine
* SpellerSoundCaptchaEngine DefaultGimpyEngineCaptcha
* BaffleListGimpyEngineCaptcha BasicListGimpyEngineCaptcha
* DeformedBaffleListGimpyEngineCaptcha DoubleRandomListGimpyEngineCaptcha
* SimpleListImageCaptchaEngineCaptcha SimpleFishEyeEngineCaptcha
*/
// 传入样式类
static {
instance = new DefaultManageableImageCaptchaService(
new FastHashMapCaptchaStore(), new ImageCaptchaEngineExtend(),
180, 100000, 75000);
}
public static ImageCaptchaService getInstance() {
return instance;
}
}
再来个servlet类
@SuppressWarnings("serial")
public class ImageCaptchaServlet extends HttpServlet {
public void init(ServletConfig servletConfig) throws ServletException {
super.init(servletConfig);
}
protected void doGet(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) throws ServletException,
IOException {
byte[] captchaChallengeAsJpeg = null;
// the output stream to render the captcha image as jpeg into
ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
try {
// get the session id that will identify the generated captcha.
// the same id must be used to validate the response, the session id
// is a good candidate!
String captchaId = httpServletRequest.getSession().getId();
// call the ImageCaptchaService getChallenge method
BufferedImage challenge = CaptchaServiceSingleton.getInstance()
.getImageChallengeForID(captchaId,
httpServletRequest.getLocale());
// a jpeg encoder
JPEGImageEncoder jpegEncoder = JPEGCodec
.createJPEGEncoder(jpegOutputStream);
jpegEncoder.encode(challenge);
} catch (IllegalArgumentException e) {
httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
} catch (CaptchaServiceException e) {
httpServletResponse
.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
return;
}
captchaChallengeAsJpeg = jpegOutputStream.toByteArray();
// flush it in the response
httpServletResponse.setHeader("Cache-Control", "no-store");
httpServletResponse.setHeader("Pragma", "no-cache");
httpServletResponse.setDateHeader("Expires", 0);
httpServletResponse.setContentType("image/jpeg");
ServletOutputStream responseOutputStream = httpServletResponse
.getOutputStream();
responseOutputStream.write(captchaChallengeAsJpeg);
responseOutputStream.flush();
responseOutputStream.close();
}
}
接着我们来配置web.xml
jcaptcha
com.shadow.extras.jcaptcha.ImageCaptchaServlet
0
jcaptcha
/jcaptcha