介紹

google captcha 是google生成驗(yàn)證碼的一個(gè)工具類,其原理是將隨機(jī)生成字符串保存到session中,同時(shí)以圖片的形式返回給頁面,之后前臺(tái)頁面提交到后臺(tái)進(jìn)行對比。

使用方法

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)證碼長度
        properties.setProperty("kaptcha.textproducer.char.length", "4");
        // 字體
        properties.setProperty("kaptcha.textproducer.font.names", "宋體,楷體,微軟雅黑");
 
 
        Config config = new Config(properties);
        defaultKaptcha.setConfig(config);
 
        return defaultKaptcha;
    }
}
更多配置參數(shù)請看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對象并轉(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;
	}