JCaptcha验证码工具的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27868061/article/details/81947872

JCaptcha是Java的验证码生成、效验工具,可以提供验证码的字体、文本装饰等功能

其maven依赖为:

<dependency>
    <groupId>com.octo.captcha</groupId>
    <artifactId>jcaptcha</artifactId>
    <version>1.0</version>
</dependency>

但是仓库配置上好像有点问题,我配了好几次仓库都不成功,后来再github上找到了源码,本地install成功,才可以使用

github地址:

https://github.com/svn2github/jcaptcha

下载源码,clean->compile->install,发现错误,依赖找不到,发现是父pom中仓库配置的问题,改为:

<repositories>
        <repository>
            <id>3rd-party</id>
            <name>Repository for 3rd-party artifacts</name>
            <url>https://maven.atlassian.com/3rdparty/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

再次编译安装,发现一个com.sun.xxxxxxx包不存在的问题,因为这个包代码太老,所以编译级别有问题,点开问题代码,发现所有问题代码都在一个main方法中,删除这个类即可,这次install成功

本地安装之后,即可在自己项目中使用

下面贴出spring的配置示例:


import com.octo.captcha.CaptchaFactory;
import com.octo.captcha.component.image.backgroundgenerator.*;
import com.octo.captcha.component.image.color.ColorGenerator;
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.BaffleTextDecorator;
import com.octo.captcha.component.image.textpaster.textdecorator.LineTextDecorator;
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.DictionaryReader;
import com.octo.captcha.component.word.FileDictionary;
import com.octo.captcha.component.word.wordgenerator.DictionaryWordGenerator;
import com.octo.captcha.component.word.wordgenerator.WordGenerator;
import com.octo.captcha.engine.CaptchaEngine;
import com.octo.captcha.engine.GenericCaptchaEngine;
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;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.awt.*;

import java.util.List;
/**
 * 图片验证码配置
 */
@Configuration
public class ImageCaptchaConfig {

    /* 图片验证码服务 */
    @Bean
    public ImageCaptchaService imageCaptchaService(CaptchaEngine captchaEngine){
        return new DefaultManageableImageCaptchaService(new FastHashMapCaptchaStore(),captchaEngine,180,100000,75000);
    }

    /* 图片验证码引擎 */
    @Bean
    public CaptchaEngine captchaEngine(CaptchaFactory captchaFactory){
        return new GenericCaptchaEngine(new CaptchaFactory[]{captchaFactory});
    }

    /* 验证码工厂,控制如何生成验证码 */
    @Bean
    public CaptchaFactory captchaFactory(WordGenerator wordGenerator,WordToImage wordToImage){
        return new GimpyFactory(wordGenerator,wordToImage);
    }

    /* 单词生成器 */
    @Bean
    public WordGenerator wordGenerator(DictionaryReader dictionaryReader){
        return new DictionaryWordGenerator(dictionaryReader);
    }

    /* 字典读取器,这里的FileDictionary从jar包自带的resource读取单词 */
    @Bean
    public DictionaryReader dictionaryReader(){
        /* 从jar包自带字典读取单词 */
        return new FileDictionary("toddlist");
    }

    /* 单词转换为图片的组件,需要字体生成器、背景生成器、文本粘贴器 */
    @Bean
    public WordToImage wordToImage(FontGenerator fontGenerator,BackgroundGenerator backgroundGenerator,TextPaster textPaster){
        return new ComposedWordToImage(fontGenerator,backgroundGenerator,textPaster);
    }

    /* 字体生成器 */
    @Bean
    public FontGenerator fontGenerator(){
        Font hakuyoxingshu = new Font("hakuyoxingshu7000",0,20);
        /* 最小最大字体大小 */
        return new RandomFontGenerator(40,50,new Font[]{hakuyoxingshu});
    }

    /* 背景生成器 */
    @Bean
    public BackgroundGenerator backgroundGenerator(){
        return new UniColorBackgroundGenerator(200,60,new Color(120,120,120));
        /* 生成效果像蛇皮 */
        //return new EllipseBackgroundGenerator(200,60);
        /* 背景由红黄绿三种颜色组成 */
        //return new FunkyBackgroundGenerator(200,60);
        /* 背景为渐变色 */
        //return new GradientBackgroundGenerator(200,60,new Color(255,0,0),new Color(0,255,0));
        //return new MultipleShapeBackgroundGenerator(200,60);
    }

    /* TextPaster将文本粘贴到背景上,需要字体颜色 */
    @Bean
    public TextPaster textPaster(){
        //TextDecorator baffle = new BaffleTextDecorator(5,new Color(0,0,0));
        TextDecorator line = new LineTextDecorator(2,new Color(0,255,0));
        Color blue = new Color(0,0,255);
        ColorGenerator generator =  new RandomListColorGenerator(new Color[]{blue});
        /* 最小最大单词长度 */
        return new DecoratedRandomTextPaster(3, 5, generator,new TextDecorator[]{line});
    }

}

最后的工具类为:

package com.xidou.common;


import com.octo.captcha.service.CaptchaServiceException;
import com.octo.captcha.service.image.DefaultManageableImageCaptchaService;
import com.octo.captcha.service.image.ImageCaptchaService;
import com.xidou.enums.ExceptionCode;
import com.xidou.vo.BizException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.util.Locale;

@Component
public class ImageCaptchaUtils {

    private static final Logger logger = LoggerFactory.getLogger(ImageCaptchaUtils.class);

    @Autowired
    private ImageCaptchaService instance;

    public void getImageCaptcha(HttpServletRequest request, HttpServletResponse response) {
        try{
            String captchaId = request.getSession().getId();
            logger.info("session id is "+captchaId);
            BufferedImage challenge = instance.getImageChallengeForID(captchaId,Locale.getDefault());
            response.setHeader("Cache-Control", "no-store");
            response.setHeader("Pragma", "no-cache");
            response.setDateHeader("Expires", 0);
            response.setContentType("image/jpeg");
            ServletOutputStream responseOutputStream = response.getOutputStream();
            ImageIO.write(challenge, "jpg", responseOutputStream);
            responseOutputStream.flush();
            responseOutputStream.close();
        }catch(Exception ex){
            throw new BizException(ExceptionCode.IMAGE_CAPTCHA_GENERATE_ERROR.getCode(),ExceptionCode.IMAGE_CAPTCHA_GENERATE_ERROR.getMsg()+ex);
        }
    }

    public void validateCaptcha(HttpServletRequest request,String code){
        Boolean isResponseCorrect =Boolean.FALSE;
        String captchaId = request.getSession().getId();
        try {
            isResponseCorrect = instance.validateResponseForID(captchaId, code);
        } catch (CaptchaServiceException ex) {
            throw new BizException(ExceptionCode.IMAGE_CAPTCHA_VALIDATE_ERROR.getCode(),ExceptionCode.IMAGE_CAPTCHA_VALIDATE_ERROR.getMsg()+ex);
        }
    }

}

可见JCaptcha有自己的验证码存储,并且将sessionId与验证码关联起来,这里主要介绍一些JCaptcha常用的组件:

ImageCaptchaService:图片验证码服务,获取BufferedImage、验证验证码都是使用这个组件
CaptchaEngine:包含了多个工厂
CaptchaFactory:验证码工厂,用于生成验证码的各种配置
WordGenerator:单词生成器,用于获取一个随机字符串
DictionaryReader:字典读取器,用于从指定资源读取单词列表
WordToImage:负责单词到图片的组件
BackgroundGenerator:背景生成器,用于生成各种效果的背景,如渐变色等
FontGenerator:字体生成器,用于生成文本字体
TextPaster:文本粘贴器,用于将文本粘贴到图片上
TextDecorator:文本装饰器,用于装饰文本,提高识别难度,有两种效果,一个是给每个字母添加墨点,另一个是给每个字母添加干扰线
ColorGenerator:颜色生成器,通用组件,用于生成一组随机颜色,很多其他组件都使用了这个组件

猜你喜欢

转载自blog.csdn.net/qq_27868061/article/details/81947872