springboot生成包含特定数字_springboot+kaptcha生成数学运算验证码和字符验证码

  • Post author:
  • Post category:其他


使用以下代码只需要复制粘贴,修改一处文本生成器路径即可,文中有交代。

1.添加kaptcha依赖

com.github.penggle

kaptcha

2.3.2

2.编写验证码文本生成器,为了给数据运算验证码用的

/*** 验证码文本生成器

*

*@authorshw*/

public class KaptchaTextCreator extendsDefaultTextCreator

{private static final String[] CNUMBERS = “0,1,2,3,4,5,6,7,8,9,10”.split(“,”);

@OverridepublicString getText()

{

Integer result= 0;

Random random= newSecureRandom();int x = random.nextInt(10);int y = random.nextInt(10);

StringBuilder suChinese= newStringBuilder();int randomoperands = (int) Math.round(Math.random() * 2);if (randomoperands == 0)

{

result= x *y;

suChinese.append(CNUMBERS[x]);

suChinese.append(“*”);

suChinese.append(CNUMBERS[y]);

}else if (randomoperands == 1)

{if (!(x == 0) && y % x == 0)

{

result= y /x;

suChinese.append(CNUMBERS[y]);

suChinese.append(“/”);

suChinese.append(CNUMBERS[x]);

}else{

result= x +y;

suChinese.append(CNUMBERS[x]);

suChinese.append(“+”);

suChinese.append(CNUMBERS[y]);

}

}else if (randomoperands == 2)

{if (x >=y)

{

result= x -y;

suChinese.append(CNUMBERS[x]);

suChinese.append(“-“);

suChinese.append(CNUMBERS[y]);

}else{

result= y -x;

suChinese.append(CNUMBERS[y]);

suChinese.append(“-“);

suChinese.append(CNUMBERS[x]);

}

}else{

result= x +y;

suChinese.append(CNUMBERS[x]);

suChinese.append(“+”);

suChinese.append(CNUMBERS[y]);

}

suChinese.append(“=?@” +result);returnsuChinese.toString();

}

}

3.编写配置文件

@Configurationpublic classCaptchaConfig

{

@Bean(name= “captchaProducer”)publicDefaultKaptcha getKaptchaBean()

{

DefaultKaptcha defaultKaptcha= newDefaultKaptcha();

Properties properties= newProperties();//是否有边框 默认为true 我们可以自己设置yes,no

properties.setProperty(KAPTCHA_BORDER, “yes”);//验证码文本字符颜色 默认为Color.BLACK

properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, “black”);//验证码图片宽度 默认为200

properties.setProperty(KAPTCHA_IMAGE_WIDTH, “160”);//验证码图片高度 默认为50

properties.setProperty(KAPTCHA_IMAGE_HEIGHT, “60”);//验证码文本字符大小 默认为40

properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, “38”);//KAPTCHA_SESSION_KEY

properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, “kaptchaCode”);//验证码文本字符长度 默认为5

properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, “4”);//验证码文本字体样式 默认为new Font(“Arial”, 1, fontSize), new Font(“Courier”, 1, fontSize)

properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, “Arial,Courier”);//图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy

properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, “com.google.code.kaptcha.impl.ShadowGimpy”);

Config config= newConfig(properties);

defaultKaptcha.setConfig(config);returndefaultKaptcha;

}

@Bean(name= “captchaProducerMath”)publicDefaultKaptcha getKaptchaBeanMath()

{

DefaultKaptcha defaultKaptcha= newDefaultKaptcha();

Properties properties= newProperties();//是否有边框 默认为true 我们可以自己设置yes,no

properties.setProperty(KAPTCHA_BORDER, “yes”);//边框颜色 默认为Color.BLACK

properties.setProperty(KAPTCHA_BORDER_COLOR, “105,179,90”);//验证码文本字符颜色 默认为Color.BLACK

properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, “blue”);//验证码图片宽度 默认为200

properties.setProperty(KAPTCHA_IMAGE_WIDTH, “160”);//验证码图片高度 默认为50

properties.setProperty(KAPTCHA_IMAGE_HEIGHT, “60”);//验证码文本字符大小 默认为40

properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, “35”);//KAPTCHA_SESSION_KEY

properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, “kaptchaCodeMath”);//验证码文本生成器

properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, “com.qjwl.rabbitmq.config.KaptchaTextCreator”);//验证码文本字符间距 默认为2

properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, “3”);//验证码文本字符长度 默认为5

properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, “6”);//验证码文本字体样式 默认为new Font(“Arial”, 1, fontSize), new Font(“Courier”, 1, fontSize)

properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, “Arial,Courier”);//验证码噪点颜色 默认为Color.BLACK

properties.setProperty(KAPTCHA_NOISE_COLOR, “white”);//干扰实现类

properties.setProperty(KAPTCHA_NOISE_IMPL, “com.google.code.kaptcha.impl.NoNoise”);//图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy

properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, “com.google.code.kaptcha.impl.ShadowGimpy”);

Config config= newConfig(properties);

defaultKaptcha.setConfig(config);returndefaultKaptcha;

}

}

注意:

这个位置的com.qjwl.rabbitmq.config.KaptchaTextCreator路径要改成你自己的验证码文本生成器的路径。

4.编写controller层

@Controller

@RequestMapping(“/captcha”)public classCodeController

{

@Resource(name= “captchaProducer”)privateProducer captchaProducer;

@Resource(name= “captchaProducerMath”)privateProducer captchaProducerMath;/*** 验证码生成*/@GetMapping(value= “/captchaImage”)publicModelAndView getKaptchaImage(HttpServletRequest request, HttpServletResponse response)

{

ServletOutputStream out= null;try{

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 type= request.getParameter(“type”);

String capStr= null;

String code= null;

BufferedImage bi= null;if (“math”.equals(type))

{

String capText=captchaProducerMath.createText();

capStr= capText.substring(0, capText.lastIndexOf(“@”));

code= capText.substring(capText.lastIndexOf(“@”) + 1);

bi=captchaProducerMath.createImage(capStr);

}else if (“char”.equals(type))

{

capStr= code =captchaProducer.createText();

bi=captchaProducer.createImage(capStr);

}

session.setAttribute(Constants.KAPTCHA_SESSION_KEY, code);

out=response.getOutputStream();

ImageIO.write(bi,”jpg”, out);

out.flush();

}catch(Exception e)

{

e.printStackTrace();

}finally{try{if (out != null)

{

out.close();

}

}catch(IOException e)

{

e.printStackTrace();

}

}return null;

}

}

注:生成验证码的时候,已经把字符验证码或者数字运算的结果code存在session之中,键为Constants.KAPTCHA_SESSION_KEY,取得时候只要从session中取这个建即可。

Constants类是kaptcha包里面的,源码如下:

packagecom.google.code.kaptcha;public classConstants

{public final static String KAPTCHA_SESSION_KEY = “KAPTCHA_SESSION_KEY”;public final static String KAPTCHA_SESSION_DATE = “KAPTCHA_SESSION_DATE”;public final static String KAPTCHA_SESSION_CONFIG_KEY = “kaptcha.session.key”;public final static String KAPTCHA_SESSION_CONFIG_DATE = “kaptcha.session.date”;public final static String KAPTCHA_BORDER = “kaptcha.border”;public final static String KAPTCHA_BORDER_COLOR = “kaptcha.border.color”;public final static String KAPTCHA_BORDER_THICKNESS = “kaptcha.border.thickness”;public final static String KAPTCHA_NOISE_COLOR = “kaptcha.noise.color”;public final static String KAPTCHA_NOISE_IMPL = “kaptcha.noise.impl”;public final static String KAPTCHA_OBSCURIFICATOR_IMPL = “kaptcha.obscurificator.impl”;public final static String KAPTCHA_PRODUCER_IMPL = “kaptcha.producer.impl”;public final static String KAPTCHA_TEXTPRODUCER_IMPL = “kaptcha.textproducer.impl”;public final static String KAPTCHA_TEXTPRODUCER_CHAR_STRING = “kaptcha.textproducer.char.string”;public final static String KAPTCHA_TEXTPRODUCER_CHAR_LENGTH = “kaptcha.textproducer.char.length”;public final static String KAPTCHA_TEXTPRODUCER_FONT_NAMES = “kaptcha.textproducer.font.names”;public final static String KAPTCHA_TEXTPRODUCER_FONT_COLOR = “kaptcha.textproducer.font.color”;public final static String KAPTCHA_TEXTPRODUCER_FONT_SIZE = “kaptcha.textproducer.font.size”;public final static String KAPTCHA_TEXTPRODUCER_CHAR_SPACE = “kaptcha.textproducer.char.space”;public final static String KAPTCHA_WORDRENDERER_IMPL = “kaptcha.word.impl”;public final static String KAPTCHA_BACKGROUND_IMPL = “kaptcha.background.impl”;public static final String KAPTCHA_BACKGROUND_CLR_FROM = “kaptcha.background.clear.from”;public static final String KAPTCHA_BACKGROUND_CLR_TO = “kaptcha.background.clear.to”;public static final String KAPTCHA_IMAGE_WIDTH = “kaptcha.image.width”;public static final String KAPTCHA_IMAGE_HEIGHT = “kaptcha.image.height”;

}

5.测试结果,如果type=math,则是算数验证码,此时得session中得code值为8,可自行验证

如果type参数为char,则是字符验证码,所以此时得code为4eym



版权声明:本文为weixin_39833290原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。