欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

浅析Java验证码生成库JCaptcha

程序员文章站 2024-03-13 15:47:15
jcaptcha是非常强大的,不光是可以生成图片式的验证码,还可以生成声音式的(新浪就使用了双重验证码)。本文简单的介绍了jcaptcha库以及使用实例,下面一起来看看。...

jcaptcha是非常强大的,不光是可以生成图片式的验证码,还可以生成声音式的(新浪就使用了双重验证码)。本文简单的介绍了jcaptcha库以及使用实例,下面一起来看看。

下载jcaptcha库

maven依赖如此添加:

<dependency>
      <groupid>com.octo.captcha</groupid>
      <artifactid>jcaptcha</artifactid>
      <version>1.0</version>
    </dependency>

封装了一个简单的类

import com.octo.captcha.component.image.backgroundgenerator.backgroundgenerator;
import com.octo.captcha.component.image.backgroundgenerator.filereaderrandombackgroundgenerator;
import com.octo.captcha.component.image.color.randomlistcolorgenerator;
import com.octo.captcha.component.image.fontgenerator.fontgenerator;
import com.octo.captcha.component.image.fontgenerator.randomfontgenerator;
import com.octo.captcha.component.image.textpaster.decoratedrandomtextpaster;
import com.octo.captcha.component.image.textpaster.textpaster;
import com.octo.captcha.component.image.textpaster.textdecorator.textdecorator;
import com.octo.captcha.component.image.wordtoimage.composedwordtoimage;
import com.octo.captcha.component.image.wordtoimage.wordtoimage;
import com.octo.captcha.component.word.wordgenerator.randomwordgenerator;
import com.octo.captcha.component.word.wordgenerator.wordgenerator;
import com.octo.captcha.engine.captchaengine;
import com.octo.captcha.engine.image.listimagecaptchaengine;
import com.octo.captcha.image.gimpy.gimpyfactory;

import java.awt.*;

/**
 * 产生验证码图片的类
 */
public class capchahelper {
  private static final integer min_word_length = 4;// 验证码最小长度
  private static final integer max_word_length = 4;// 验证码最大长度
  private static final integer image_height = 30;// 验证码图片高度
  private static final integer image_width = 130;// 验证码图片宽度
  private static final integer min_font_size = 15;// 验证码最小字体
  private static final integer max_font_size = 15;// 验证码最大字体
  private static final string random_word = "0123456789";// 随机字符

  // 验证码随机字体
  private static final font[] random_font = new font[]{
      new font("nyala", font.bold, min_font_size),
      new font("arial", font.bold, min_font_size),
      new font("bell mt", font.bold, min_font_size),
      new font("credit valley", font.bold, min_font_size),
      new font("impact", font.bold, min_font_size)
  };

  // 验证码随机颜色
  private static final color[] random_color = new color[]{
      new color(255, 255, 255),
      new color(255, 220, 220),
      new color(220, 255, 255),
      new color(220, 220, 255),
      new color(255, 255, 220),
      new color(220, 255, 220)
  };

  private static listimagecaptchaengine captchaengine;

  public static captchaengine getcaptchaengine(final string imgpath) {
    if (captchaengine == null) {
      synchronized (capchahelper.class) {
        if (captchaengine == null && imgpath != null) {
          captchaengine = new listimagecaptchaengine() {
            @override
            protected void buildinitialfactories() {
              randomlistcolorgenerator randomlistcolorgenerator = new randomlistcolorgenerator(random_color);
              backgroundgenerator backgroundgenerator = new filereaderrandombackgroundgenerator(image_width, image_height, imgpath);
              wordgenerator wordgenerator = new randomwordgenerator(random_word);
              fontgenerator fontgenerator = new randomfontgenerator(min_font_size, max_font_size, random_font);
              textdecorator[] textdecorator = new textdecorator[]{};
              textpaster textpaster = new decoratedrandomtextpaster(min_word_length, max_word_length, randomlistcolorgenerator, textdecorator);
              wordtoimage wordtoimage = new composedwordtoimage(fontgenerator, backgroundgenerator, textpaster);
              addfactory(new gimpyfactory(wordgenerator, wordtoimage));
            }
          };
        }
      }
    }
    return captchaengine;
  }
}

响应网页中对验正码图像的请求

可以定义一个servlet响应这个请求,如果用springmvc,也可以用某个controller中的某个方法响应这个请求,不管怎样,都需要指定一个路径对应到servlet或controller的方法,比如路径是:”/aaa/captcha”

那么在响应对这个路径的请求的servlet中可以这样写:

//获取验证码背景图片的路径,这路径放了很多作为背景的图像
    string captcha_backgrounds = session.getservletcontext().getrealpath("/web-inf/img/captcha");
    captchaengine ce = capchahelper.getcaptchaengine(captcha_backgrounds);
    //需要admin网页中用js定时从服务端获取当前的验证码
    captcha captcha = ce.getnextcaptcha();
    //为了验证,把captcha对象放到session中,以在客户端提交验证码时进行验证
    req.getsession().setattribute("captcha", captcha);
    //获取验证码图片,这是未压缩的位图
    bufferedimage image = (bufferedimage) captcha.getchallenge();
    resp.setcontenttype("image/jpeg");
    imageio.write(image, "jpg", resp.getoutputstream());

如果用springmvc,就这样写:

//获取验证码背景图片的路径,这路径放了很多作为背景的图像
    string captcha_backgrounds = session.getservletcontext().getrealpath("/web-inf/img/captcha");
    captchaengine ce = capchahelper.getcaptchaengine(captcha_backgrounds);
    //需要admin网页中用js定时从服务端获取当前的验证码
    captcha captcha = ce.getnextcaptcha();
    //为了验证,把captcha对象放到session中,以在客户端提交验证码时进行验证
    session.setattribute("captcha", captcha);
    //获取验证码图片,这是未压缩的位图
    bufferedimage image = (bufferedimage) captcha.getchallenge();
    bytearrayoutputstream bao=new bytearrayoutputstream();
    //应缩成jpg并写到输出流中
    imageio.write(image, "jpg", bao);
    return bao.tobytearray();

这两种方式,向客户端返回的都是二进制数据。

string captcha_backgrounds = session.getservletcontext().getrealpath(“/web-inf/img/captcha”);

表示路径/web-inf/img/captcha下面放的是作为验证码图像的背景的多张图片,必须是jpeg,大小可能没限制,你可以自己试一下。

网页中用 <img> 指向这个地址

<img id="captcha" src="/captcha_img" onclick="refreshcaptchaimg()" />

js函数refreshcaptchaimg()响应图片的点击,每点击一次,就重新获取一张新的验证码图片。如何重新获取验正码图片呢?

只需改变img的src属性,但这里是每次都是用同一个地址来设置这个属性,这样不会引起真正的刷新,所以方法refreshcaptchaimg()是这样实现的:

function refreshcaptchaimg() {
      //从服务端重新下载验证码图片
      //给这个地加参数纯为了强制刷新,否则由于src指向的url地址没变,浏览器不会真正生刷新图片
      var now = new date()
      $("#captcha").attr("src","/captcha_img?"+now.gettime());

以上就是java中验证码生成库jcaptcha的介绍及使用,希望对大家学习java有所帮助。