Google Kaptcha 生成图形验证码

官方的pom

<dependency>  
    <groupId>com.google.code.kaptcha</groupId>  
    <artifactId>kaptcha</artifactId>  
    <version>2.3.2</version>  
</dependency>

阿里的maven仓库pom

<dependency>  
    <groupId>com.github.penggle</groupId>  
    <artifactId>kaptcha</artifactId>  
    <version>2.3.2</version>  
</dependency>

控制验证码的图片的生成的规则的配置信息都放到了com.google.code.kaptcha.util.Config类中

package com.google.code.kaptcha.util;

import java.awt.Color;
import java.awt.Font;
import java.util.Properties;

import com.google.code.kaptcha.BackgroundProducer;
import com.google.code.kaptcha.GimpyEngine;
import com.google.code.kaptcha.NoiseProducer;
import com.google.code.kaptcha.Producer;
import com.google.code.kaptcha.impl.DefaultBackground;
import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.impl.DefaultNoise;
import com.google.code.kaptcha.impl.WaterRipple;
import com.google.code.kaptcha.text.TextProducer;
import com.google.code.kaptcha.text.WordRenderer;
import com.google.code.kaptcha.text.impl.DefaultTextCreator;
import com.google.code.kaptcha.text.impl.DefaultWordRenderer;
import com.google.code.kaptcha.util.ConfigHelper;

public class Config
{
  private Properties properties;
  private ConfigHelper helper;
  
  public Config(Properties properties)
  {
    this.properties = properties;
    this.helper = new ConfigHelper();
  }
  
  /**
   * 设置图片是否有边框
   * @return
   */
  public boolean isBorderDrawn()
  {
    String paramName = "kaptcha.border";
    String paramValue = this.properties.getProperty(paramName);
    return this.helper.getBoolean(paramName, paramValue, true);
  }
  
  /**
   * 边框颜色   合法值: r,g,b (and optional alpha) 或者 white,black,blue.
   * @return
   */
  public Color getBorderColor()
  {
    String paramName = "kaptcha.border.color";
    String paramValue = this.properties.getProperty(paramName);
    return this.helper.getColor(paramName, paramValue, Color.BLACK);
  }
  
  /**
   * 边框厚度  合法值:>0
   * @return
   */
  public int getBorderThickness()
  {
    String paramName = "kaptcha.border.thickness";
    String paramValue = this.properties.getProperty(paramName);
    return this.helper.getPositiveInt(paramName, paramValue, 1);
  }
  
  /**
   * 文本集合,验证码值从此集合中获取
   * @return
   */
  public char[] getTextProducerCharString()
  {
    String paramName = "kaptcha.textproducer.char.string";
    String paramValue = this.properties.getProperty(paramName);
    return this.helper.getChars(paramName, paramValue, "abcde2345678gfynmnpwx".toCharArray());
  }
  
  /**
   * 验证码长度
   * @return
   */
  public int getTextProducerCharLength()
  {
    String paramName = "kaptcha.textproducer.char.length";
    String paramValue = this.properties.getProperty(paramName);
    return this.helper.getPositiveInt(paramName, paramValue, 5);
  }
  
  /**
   * 字体类型
   * @param fontSize 见Font中的定义
   * @return
   */
  public Font[] getTextProducerFonts(int fontSize)
  {
    String paramName = "kaptcha.textproducer.font.names";
    String paramValue = this.properties.getProperty(paramName);
    return this.helper.getFonts(paramName, paramValue, fontSize, new Font[] { new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) });
  }
  
  /**
   * 字体大小
   * @return
   */
  public int getTextProducerFontSize()
  {
    String paramName = "kaptcha.textproducer.font.size";
    String paramValue = this.properties.getProperty(paramName);
    return this.helper.getPositiveInt(paramName, paramValue, 40);
  }
  
  /**
   * 字体颜色  rgb颜色或者Color中的值
   * @return
   */
  public Color getTextProducerFontColor()
  {
    String paramName = "kaptcha.textproducer.font.color";
    String paramValue = this.properties.getProperty(paramName);
    return this.helper.getColor(paramName, paramValue, Color.BLACK);
  }
  
  /**
   * 干扰线的颜色
   * @return
   */
  public Color getNoiseColor()
  {
    String paramName = "kaptcha.noise.color";
    String paramValue = this.properties.getProperty(paramName);
    return this.helper.getColor(paramName, paramValue, Color.BLACK);
  }
    
  /**
   * 背景颜色渐变色开始色  rgb或者Color中定义的
   * @return
   */
  public Color getBackgroundColorFrom()
  {
    String paramName = "kaptcha.background.clear.from";
    String paramValue = this.properties.getProperty(paramName);
    return this.helper.getColor(paramName, paramValue, Color.LIGHT_GRAY);
  }
  
  /**
   * 背景颜色渐变色结束色   rgb或者Color中定义的
   * @return
   */
  public Color getBackgroundColorTo()
  {
    String paramName = "kaptcha.background.clear.to";
    String paramValue = this.properties.getProperty(paramName);
    return this.helper.getColor(paramName, paramValue, Color.WHITE);
  }
  
  /**
   * 图片的宽度
   * @return
   */
  public int getWidth()
  {
    String paramName = "kaptcha.image.width";
    String paramValue = this.properties.getProperty(paramName);
    return this.helper.getPositiveInt(paramName, paramValue, 200);
  }
  
  /**
   * 图片的高度
   * @return
   */
  public int getHeight()
  {
    String paramName = "kaptcha.image.height";
    String paramValue = this.properties.getProperty(paramName);
    return this.helper.getPositiveInt(paramName, paramValue, 50);
  }
  
  /**
   * 图片的session key
   * @return
   */
  public String getSessionKey()
  {
    return this.properties.getProperty("kaptcha.session.key", "KAPTCHA_SESSION_KEY");
  }
  
  public Properties getProperties()
  {
    return this.properties;
  }
  
  /**
   * 生成默认的图片生产者实现
   * @return
   */
  public Producer getProducerImpl()
  {
    String paramName = "kaptcha.producer.impl";
    String paramValue = this.properties.getProperty(paramName);
    Producer producer = (Producer)this.helper.getClassInstance(paramName, paramValue, new DefaultKaptcha(), this);
    return producer;
  }
  
  /**
   * 生成默认的验证码文字生产者实现
   * @return
   */
  public TextProducer getTextProducerImpl()
  {
    String paramName = "kaptcha.textproducer.impl";
    String paramValue = this.properties.getProperty(paramName);
    TextProducer textProducer = (TextProducer)this.helper.getClassInstance(paramName, paramValue, new DefaultTextCreator(), this);
    
    return textProducer;
  }
  
  /**
   * 文字干扰实现类,默认DefaultNoise,还可以选择com.google.code.kaptcha.impl.NoNoise没有干扰线的实现类
   * @return
   */
  public NoiseProducer getNoiseImpl()
  {
      String paramName = "kaptcha.noise.impl";
      String paramValue = this.properties.getProperty(paramName);
      NoiseProducer noiseProducer = (NoiseProducer)this.helper.getClassInstance(paramName, paramValue, new DefaultNoise(), this);
      
      return noiseProducer;
  }
  
  /**
   * 图片样式的实现类,默认WaterRipple(水纹),还有下面2种可选
   * 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy    阴影com.google.code.kaptcha.impl.ShadowGimpy
   * 
   * @return
   */
  public GimpyEngine getObscurificatorImpl()
  {
    String paramName = "kaptcha.obscurificator.impl";
    String paramValue = this.properties.getProperty(paramName);
    GimpyEngine gimpyEngine = (GimpyEngine)this.helper.getClassInstance(paramName, paramValue, new WaterRipple(), this);
    return gimpyEngine;
  }
  
  /**
   * 文字渲染实现类,默认DefaultWordRenderer,也只有这一个默认的实现类
   * @return
   */
  public WordRenderer getWordRendererImpl()
  {
    String paramName = "kaptcha.word.impl";
    String paramValue = this.properties.getProperty(paramName);
    WordRenderer wordRenderer = (WordRenderer)this.helper.getClassInstance(paramName, paramValue, new DefaultWordRenderer(), this);
    
    return wordRenderer;
  }
  
  /**
   * 背景图片实现类,默认DefaultBackground,也只有这一个默认实现类
   * @return
   */
  public BackgroundProducer getBackgroundImpl()
  {
    String paramName = "kaptcha.background.impl";
    String paramValue = this.properties.getProperty(paramName);
    BackgroundProducer backgroundProducer = (BackgroundProducer)this.helper.getClassInstance(paramName, paramValue, new DefaultBackground(), this);
    
    return backgroundProducer;
  }
}

spring bean的配置

<!-- google kaptcha的相关配置-->
    <bean id="captchaProducer" class="com.google.code.kaptcha.impl.DefaultKaptcha">  
        <property name="config">  
            <bean class="com.google.code.kaptcha.util.Config">  
                <constructor-arg>  
                    <props> 
                        <!-- 是否有边框 可选yes 或者 no --> 
                        <prop key="kaptcha.border">yes</prop>  
                        <!-- 边框颜色 -->
                        <prop key="kaptcha.border.color">105,179,90</prop>  
                        <!-- 验证码文本字符颜色 -->
                        <prop key="kaptcha.textproducer.font.color">blue</prop>  
                        <!-- 验证码文本字符大小 -->
                        <prop key="kaptcha.textproducer.font.size">45</prop>  
                        <!-- 验证码图片的宽度 默认200 -->
                        <prop key="kaptcha.image.width">125</prop>  
                        <!-- 验证码图片的高度 默认50 -->
                        <prop key="kaptcha.image.height">45</prop>  
                        <!-- 验证码文本字符长度  默认为5 -->
                        <prop key="kaptcha.textproducer.char.length">4</prop>  
                        <!-- 验证码文本字体样式  默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)  -->
                        <prop key="kaptcha.textproducer.font.names">宋体,楷体,微软雅黑</prop>  
                    </props>  
                </constructor-arg>  
            </bean>  
        </property>  
    </bean>

springboot使用配置

import java.util.Properties;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.google.code.kaptcha.Producer;
import com.google.code.kaptcha.util.Config;

@Configuration
public class KaptchaConfig {

    @Bean
    public Producer KaptchaProducer() {
        Properties kaptchaProperties = new Properties();
        kaptchaProperties.put("kaptcha.border", "no");
        kaptchaProperties.put("kaptcha.textproducer.char.length","4");
        kaptchaProperties.put("kaptcha.image.height","50");
        kaptchaProperties.put("kaptcha.image.width","150");
        kaptchaProperties.put("kaptcha.obscurificator.impl","com.google.code.kaptcha.impl.ShadowGimpy");
        kaptchaProperties.put("kaptcha.textproducer.font.color","black");
        kaptchaProperties.put("kaptcha.textproducer.font.size","40");
        kaptchaProperties.put("kaptcha.noise.impl","com.google.code.kaptcha.impl.NoNoise");
        //kaptchaProperties.put("kaptcha.noise.impl","com.google.code.kaptcha.impl.DefaultNoise");
        kaptchaProperties.put("kaptcha.textproducer.char.string","acdefhkmnprtwxy2345678");

        Config config = new Config(kaptchaProperties);
        return config.getProducerImpl();
    }
}

使用示例:

import com.google.code.kaptcha.Constants;
import com.google.code.kaptcha.Producer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.image.BufferedImage;
import java.io.IOException;

@Controller
@Slf4j
public class KaptchaController {

    private final Producer captchaProducer;

    @Autowired
    public KaptchaController(Producer captchaProducer) {
        this.captchaProducer = captchaProducer;
    }

    @RequestMapping("/image/code")
    public ModelAndView kaptcha(HttpServletRequest request, HttpServletResponse response) throws IOException {
        HttpSession session = request.getSession();
        response.setDateHeader("Expires", 0);
        response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
        response.addHeader("Cache-Control", "post-check=0, pre-check=0");
        response.setHeader("Pragma", "no-cache");
        response.setContentType("image/jpeg");

        String capText = captchaProducer.createText();
        session.setAttribute(Constants.KAPTCHA_SESSION_KEY, capText);

        String code = (String) session.getAttribute(Constants.KAPTCHA_SESSION_KEY);
        log.info("输出验证码:[{}]", code);

        BufferedImage bi = captchaProducer.createImage(capText);
        ServletOutputStream out = response.getOutputStream();
        ImageIO.write(bi, "jpg", out);
        out.flush();
        out.close();
        return null;
    }
}

参考:
https://www.cnblogs.com/FlyHeLanMan/p/6293991.html
https://blog.csdn.net/victor_cindy1/article/details/78603734
https://www.cnblogs.com/yangzhilong/p/8574685.html

猜你喜欢

转载自www.cnblogs.com/wbyixx/p/12563682.html