使用以下代碼只需要復制粘貼,修改一處文本生成器路徑即可,文中有交代。
1.添加kaptcha依賴
<dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version> </dependency>
2.編寫驗證碼文本生成器,為了給數據運算驗證碼用的
/** * 驗證碼文本生成器 * * @author shw */ public class KaptchaTextCreator extends DefaultTextCreator { private static final String[] CNUMBERS = "0,1,2,3,4,5,6,7,8,9,10".split(","); @Override public String getText() { Integer result = 0; Random random = new SecureRandom(); int x = random.nextInt(10); int y = random.nextInt(10); StringBuilder suChinese = new StringBuilder(); 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); return suChinese.toString(); } }
3.編寫配置文件
@Configuration public class CaptchaConfig { @Bean(name = "captchaProducer") public DefaultKaptcha getKaptchaBean() { DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); Properties properties = new Properties(); // 是否有邊框 默認為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 = new Config(properties); defaultKaptcha.setConfig(config); return defaultKaptcha; } @Bean(name = "captchaProducerMath") public DefaultKaptcha getKaptchaBeanMath() { DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); Properties properties = new Properties(); // 是否有邊框 默認為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 = new Config(properties); defaultKaptcha.setConfig(config); return defaultKaptcha; } }
注意:
這個位置的com.qjwl.rabbitmq.config.KaptchaTextCreator路徑要改成你自己的驗證碼文本生成器的路徑。
4.編寫controller層
@Controller @RequestMapping("/captcha") public class CodeController { @Resource(name = "captchaProducer") private Producer captchaProducer; @Resource(name = "captchaProducerMath") private Producer captchaProducerMath; /** * 驗證碼生成 */ @GetMapping(value = "/captchaImage") public ModelAndView 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包里面的,源碼如下:
package com.google.code.kaptcha; public class Constants { 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