jcaptcha图片验证码【解决JDK1.8图片不显示问题】

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";
    }

效果图:

猜你喜欢

转载自blog.csdn.net/wildwolf_001/article/details/82224369