maven依赖
<dependency>
<groupId>com.octo.captcha</groupId>
<artifactId>jcaptcha-all</artifactId>
<version>1.0-RC6</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.2</version>
</dependency>
代码:
/**
* @author: Mqs
* @date 2018/8/30 16:59
* @description: 必须为单利模式
*/
public class CaptchaServiceSingleton {
private static ImageCaptchaService instance =new DefaultManageableImageCaptchaService(
new FastHashMapCaptchaStore(), new CaptchaImageEngine(), 180,
100000 , 75000);
public static ImageCaptchaService getInstance(){
return instance;
}
}
package com.mqs.demo.utils;
import com.octo.captcha.component.image.backgroundgenerator.BackgroundGenerator;
import com.octo.captcha.component.image.backgroundgenerator.UniColorBackgroundGenerator;
import com.octo.captcha.component.image.color.RandomRangeColorGenerator;
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.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.wordgenerator.RandomWordGenerator;
import com.octo.captcha.component.word.wordgenerator.WordGenerator;
import com.octo.captcha.engine.image.ListImageCaptchaEngine;
import com.octo.captcha.image.gimpy.GimpyFactory;
import java.awt.*;
/**
* @author: Mqs
* @date 2018/8/30 14:52
* @description:
*/
public class CaptchaImageEngine extends ListImageCaptchaEngine {
@Override
protected void buildInitialFactories() {
// 自定义要展示的内容
WordGenerator wgen = new RandomWordGenerator("abcdefghijklmnopqrstuvwxyz");
// 生成随机颜色,参数分别表示RGBA的取值范围
RandomRangeColorGenerator colors = new RandomRangeColorGenerator(
new int[] { 0, 255 }, new int[] { 0, 180 },
new int[] { 0, 210 });
// 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[] { 0, 255 }, new int[] { 150, 180 }, new int[] {
150, 210 });
// 随机文字多少和颜色,参数1和2表示最少生成多少个文字和最多生成多少个
TextPaster textPaster = new DecoratedRandomTextPaster(new Integer(4),
new Integer(4),
colors,
true,
new TextDecorator[] { new LineTextDecorator(new Integer(1), lineColors) });
//生成背景的大小这里是宽140高45的图片,背景颜色为白色
BackgroundGenerator backgroundGenerator = new UniColorBackgroundGenerator(new Integer(140), new Integer(45), Color.white);
// 字体随机生成
FontGenerator fontGenerator = new RandomFontGenerator(new Integer(30), new Integer(0), fonts);
// WaterFilter water = new WaterFilter();
//
// water.setAmplitude(4d);
// water.setAntialias(true);
// water.setPhase(20d);
// water.setWavelength(60d);
//
// ImageDeformation backDef = new ImageDeformationByFilters(
// new ImageFilter[] {});
// ImageDeformation textDef = new ImageDeformationByFilters(
// new ImageFilter[] {});
// ImageDeformation postDef = new ImageDeformationByFilters(
// new ImageFilter[] { water });
// WordToImage cwti = new DeformedComposedWordToImage(fontGenerator,backgroundGenerator,textPaster, backDef, textDef, postDef);
// 生成图片输出
WordToImage cwti = new ComposedWordToImage(fontGenerator, backgroundGenerator, textPaster);
this.addFactory(new GimpyFactory(wgen, cwti));
}
}
以上被注释掉的是因为jdk8不支持,不能够正常显示,也不会报错。
测试代码:
/**
* 生成图形验证码
* @param request
* @param response
* @return
* @throws IOException
*/
@GetMapping("/verifyImg")
@ResponseBody
public String verifyImg(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setHeader("Cache-Control", "no-store");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg");
ServletOutputStream out = response.getOutputStream();
try {
String captchaId = request.getSession(true).getId();
BufferedImage challenge = (BufferedImage) CaptchaServiceSingleton.getInstance()
.getChallengeForID(captchaId, request.getLocale());
ImageIO.write(challenge, "jpg", out);
out.flush();
} catch (CaptchaServiceException e) {
System.out.println("图形验证码生成出错");
} finally {
out.close();
}
System.out.println("success");
return "succeed";
}
效果图: