介紹
google captcha 是google生成驗(yàn)證碼的一個(gè)工具類,其原理是將隨機(jī)生成字符串保存到session中,同時(shí)以圖片的形式返回給頁(yè)面,之后前臺(tái)頁(yè)面提交到后臺(tái)進(jìn)行對(duì)比。
使用方法
1.導(dǎo)入jar包
<!-- Kaptcha --> <dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> <version>${kaptcha.version}</version> </dependency>
2.在Springboot的配置包里加入CaptchaConfig配置
@Configuration public class KaptchaConfig { @Bean(name="captchaProducer") public DefaultKaptcha getDefaultKaptcha(){ com.google.code.kaptcha.impl.DefaultKaptcha defaultKaptcha = new com.google.code.kaptcha.impl.DefaultKaptcha(); Properties properties = new Properties(); // 圖片邊框 properties.setProperty("kaptcha.border", "yes"); // 邊框顏色 properties.setProperty("kaptcha.border.color", "105,179,90"); // 字體顏色 properties.setProperty("kaptcha.textproducer.font.color", "blue"); // 圖片寬 properties.setProperty("kaptcha.image.width", "110"); // 圖片高 properties.setProperty("kaptcha.image.height", "40"); // 字體大小 properties.setProperty("kaptcha.textproducer.font.size", "30"); // session key properties.setProperty("kaptcha.session.key", "code"); // 驗(yàn)證碼長(zhǎng)度 properties.setProperty("kaptcha.textproducer.char.length", "4"); // 字體 properties.setProperty("kaptcha.textproducer.font.names", "宋體,楷體,微軟雅黑"); Config config = new Config(properties); defaultKaptcha.setConfig(config); return defaultKaptcha; } }更多配置參數(shù)請(qǐng)看http://m.dgkbdq.com/3407.html
3.編寫獲取驗(yàn)證碼業(yè)務(wù)邏輯
/* * @Description //獲取驗(yàn)證碼 * @Param [request, response] * @return void **/ //這里的captchaProducer要和KaptchaConfig里面的bean命名一樣 @Autowired private Producer captchaProducer; @RequestMapping(value = "/captcha") public void getKaptchaImage(HttpServletRequest request, HttpServletResponse response) throws Exception { //用字節(jié)數(shù)組存儲(chǔ) byte[] captchaChallengeAsJpeg = null; ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream(); ServletOutputStream responseOutputStream = response.getOutputStream(); final HttpSession httpSession=request.getSession(); try { //生產(chǎn)驗(yàn)證碼字符串并保存到session中 String createText = captchaProducer.createText(); //打印隨機(jī)生成的字母和數(shù)字 log.debug(createText); httpSession.setAttribute(Constants.KAPTCHA_SESSION_KEY, createText); //使用生產(chǎn)的驗(yàn)證碼字符串返回一個(gè)BufferedImage對(duì)象并轉(zhuǎn)為byte寫入到byte數(shù)組中 BufferedImage challenge = captchaProducer.createImage(createText); ImageIO.write(challenge, "jpg", jpegOutputStream); captchaChallengeAsJpeg = jpegOutputStream.toByteArray(); response.setHeader("Cache-Control", "no-store"); response.setHeader("Pragma", "no-cache"); response.setDateHeader("Expires", 0); response.setContentType("image/jpeg"); //定義response輸出類型為image/jpeg類型,使用response輸出流輸出圖片的byte數(shù)組 responseOutputStream.write(captchaChallengeAsJpeg); responseOutputStream.flush(); } catch (IllegalArgumentException e) { response.sendError(HttpServletResponse.SC_NOT_FOUND); return; }finally { responseOutputStream.close(); } }
4.驗(yàn)證碼校驗(yàn)
不必在意ReturnMessBody,只要關(guān)注驗(yàn)證的邏輯思路
/* * @Description //校驗(yàn)驗(yàn)證碼 * @Param [request] * @return java.lang.String **/ @RequestMapping(value = "/checkcode", method = RequestMethod.POST, produces = "text/html; charset=utf-8") public ReturnMessBody checkcode(HttpServletRequest request) { ReturnMessBody returnMessBody; String captchaId = (String) request.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY); String parameter = request.getParameter("veritycode"); System.out.println("Session vrifyCode "+captchaId+" form veritycode "+parameter); if (!captchaId.equals(parameter)) { log.debug("驗(yàn)證碼錯(cuò)誤"); returnMessBody = ReturnMessBodyUtil.fail("驗(yàn)證碼錯(cuò)誤!"); } else { returnMessBody =ReturnMessBodyUtil.success(); log.debug("登錄成功"); } return returnMessBody; }