简介

  • 在实现登录功能时,大多数情况需要验证码支持,目的是防止机器人暴力破解密码。
  • 目前比较简单的验证码通过一些OCR工具就可以解析出来,复杂的验证码(一般通过扭曲、加线条或噪点等干扰)能够防止OCR识别。更复杂的如填字、算数等验证码则需要人工识别。
  • 目前比较可靠的是手机验证码,但是对于用户来说比普通验证码要麻烦得多。
  • 验证码图片可以通过Java提供的图片API实现,也可以借助如JCaptcha(Completely Automated Public Turing Test To Tell Computers adn Humans Apart)这种开源Java类库生成,它提供了常见的扭曲、加线条和噪点等干扰的支持。

示例

  • 基于第十六章,是一个权限管理系统,但本例中后台管理不是主要内容,现新增一个jcaptcha包,放置所有和验证码有关的类,用于实现用户登录时获取验证码和提交表单后校验验证码的功能。

  • 依赖:

    <!--jcaptcha核心-->
    <dependency>  
        <groupId>com.octo.captcha</groupId>  
        <artifactId>jcaptcha</artifactId>  
        <version>2.0-alpha-1</version>  
    </dependency>  
    <!--支持与servlet集成-->
    <dependency>  
        <groupId>com.octo.captcha</groupId>  
        <artifactId>jcaptcha-integration-simple-servlet</artifactId>  
        <version>2.0-alpha-1</version>  
        <exclusions>  
            <exclusion>  
                <artifactId>servlet-api</artifactId>  
                <groupId>javax.servlet</groupId>  
            </exclusion>  
        </exclusions>  
    </dependency>
    
  • 实际能用的依赖如下:

      <!--jcaptcha验证码工具-->
      <dependency><!--jcaptcha核心-->
    <groupId>com.octo.captcha</groupId>
    <artifactId>jcaptcha</artifactId>
    <version>1.0</version>
    <exclusions> <!--不排除此包,tomcat启动出错-->
      <exclusion>
        <artifactId>servlet-api</artifactId>
        <groupId>javax.servlet</groupId>
      </exclusion>
    </exclusions>
    


    com.octo.captcha
    jcaptcha-api
    1.0
  • GMailEngine:验证码图片生成引擎,继承自ListImageCaptchaEngine,只需要简单设置以下图片和字体大小等,即可仿照jcaptcha2.0生成类似GMail验证码的样式。

public class GMailEngine extends ListImageCaptchaEngine {

    @Override
    protected void buildInitialFactories() {

        // 图片和字体大小设置
        int minWordLength = 4;
        int maxWordLength = 5;
        int fontSize = 20;
        int imageWidth = 100;
        int imageHeight = 36;

        WordGenerator dictionnaryWords = new ComposeDictionaryWordGenerator(
                new FileDictionary("toddlist"));

        // word2image components
        TextPaster randomPaster = new DecoratedRandomTextPaster(minWordLength,
                maxWordLength, new RandomListColorGenerator(new Color[]{
                new Color(23, 170, 27), new Color(220, 34, 11),
                new Color(23, 67, 172)}), new TextDecorator[]{});
        BackgroundGenerator background = new UniColorBackgroundGenerator(
                imageWidth, imageHeight, Color.white);
        FontGenerator font = new RandomFontGenerator(fontSize, fontSize,
                new Font[]{new Font("nyala", Font.BOLD, fontSize),
                        new Font("Bell MT", Font.PLAIN, fontS