標籤:kaptcha 驗證碼
captcha實現驗證碼驗證使用者登入,防止密碼被暴力破解。
下面是在Springmvc架構中運行。
匯入的jar包:kaptcha-2.3.2.jar
:http://download.csdn.net/detail/u013147600/9052871
或是在maven ---pom.xml:配置如下
<!-- 驗證碼工具 -->
<dependency>
<groupId>com.google.code</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
Web.xml的配置
<span style="font-size:14px;"><!-- 驗證碼Servlet --> <servlet> <servlet-name>kaptcha</servlet-name> <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>kaptcha</servlet-name> <url-pattern>/kaptcha.jpg</url-pattern> </servlet-mapping></span>
springmvc.xml 配置
(captchaProducer相當於一個類,使用者而已根據自己的要求對其屬性進行修改)
<span style="font-size:14px;"><!-- captcha一些屬性的配置 --><bean id="captchaProducer" class="com.google.code.kaptcha.impl.DefaultKaptcha"> <property name="config"> <bean class="com.google.code.kaptcha.util.Config"> <constructor-arg> <props> <prop key="kaptcha.border">yes</prop> <prop key="kaptcha.border.color">105,179,90</prop> <prop key="kaptcha.textproducer.font.color">blue</prop> <prop key="kaptcha.image.width">125</prop> <prop key="kaptcha.image.height">45</prop> <prop key="kaptcha.textproducer.font.size">45</prop> <prop key="kaptcha.session.key">code</prop> <prop key="kaptcha.textproducer.char.length">4</prop> <prop key="kaptcha.textproducer.font.names">宋體,楷體,微軟雅黑</prop> </props> </constructor-arg> </bean> </property> </bean></span>
SpringUtils.java 解析類
(用於解析springmvc.xml中的bean)
<span style="font-size:14px;">package com.authc.utils;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;/** * @author lyx * * 2015-8-18下午3:53:19 * *com.utils.SpringUtil *TODO */public class SpringUtil {private static ApplicationContext ctx =new ClassPathXmlApplicationContext("springmvc.xml");public static Object getBean(String beanId){return ctx.getBean(beanId);}}</span>
UserController控制層類
<span style="font-size:14px;">@Controller@RequestMapping("/member")public class UserController { private Producer captchaProducer; @RequestMapping(value = "captcha-image") public ModelAndView getKaptchaImage(HttpServletRequest request, HttpServletResponse response) throws Exception { HttpSession session = request.getSession(); //擷取springmvc.xml中的captchaProducer Bean captchaProducer = (Producer) SpringUtil.getBean("captchaProducer"); String code = (String)session.getAttribute(Constants.KAPTCHA_SESSION_KEY); System.out.println("系統產生的驗證碼: " + code ); 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 capText = captchaProducer.createText(); //將系統產生的驗證碼放入Session中 session.setAttribute(Constants.KAPTCHA_SESSION_KEY, capText); BufferedImage bi = captchaProducer.createImage(capText); ServletOutputStream out = response.getOutputStream(); ImageIO.write(bi, "jpg", out); try { out.flush(); } finally { out.close(); } return null; } @RequestMapping("/checkCode")public String checkCode(HttpServletRequest request){//擷取使用者輸入的驗證碼String submitCode = WebUtils.getCleanParam(request,"j_code");//從session中擷取系統產生的驗證碼String kaptchaExpected = (String) request.getSession().getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY); System.out.println("使用者輸入的驗證碼是:"+submitCode+",系統產生的驗證碼:"+kaptchaExpected);//進行比較if(StringUtils.isEmpty(submitCode) || StringUtils.equalsIgnoreCase(submitCode, kaptchaExpected)){request.setAttribute("checkCode","驗證碼正確!");}else{request.setAttribute("checkCode","驗證碼錯誤!");}return "/kaptcha";}}</span>
註:這裡是在Controller中進行驗證,比較合適的方法應該是在js裡面對使用者輸入的驗證碼進行驗證
kaptcha.jsp頁面
<span style="font-size:14px;"><%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@page isELIgnored="false"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <base href="<%=basePath%>"> <title>驗證碼</title> <script type="text/javascript" src="<%=request.getContextPath()%>/res/js/jquery-1.11.3.min.js"> </script></head> <body> <script type="text/javascript"> $(function(){ //產生驗證碼 $('#kaptchaImage').click(function () { $(this).hide().attr('src', '<%=path%>/member/captcha-image?' + Math.floor(Math.random()*100) ).fadeIn(); }); }); window.onbeforeunload = function(){ //關閉視窗時自動結束 if(event.clientX>360&&event.clientY<0||event.altKey){ alert(parent.document.location); } }; function changeCode() { //重新整理 $('#kaptchaImage').hide().attr('src', '<%=path%>/member/captcha-image?' + Math.floor(Math.random()*100) ).fadeIn(); event.cancelBubble=true; } </script> <div class="form-group"> <label>驗證碼 </label> <form action="<%=path%>/member/checkCode"> <input name="j_code" type="text" id="kaptcha" maxlength="4" class="form-control" /> <br/> <img src="<%=path%>/member/captcha-image" id="kaptchaImage" style="margin-bottom: -3px"/> <a href="#" onclick="changeCode()">看不清?換一張</a> <input type="submit" value="驗證"> <span>${checkCode }</span> </form></div> </body></html></span>
kaptcha可配置項:
kaptcha.border 是否有邊框 預設為true 我們可以自己設定yes,nokaptcha.border.color 邊框顏色 預設為Color.BLACKkaptcha.border.thickness 邊框粗細度 預設為1kaptcha.producer.impl 驗證碼產生器 預設為DefaultKaptchakaptcha.textproducer.impl 驗證碼文本產生器 預設為DefaultTextCreatorkaptcha.textproducer.char.string 驗證碼文本字元內容約制 預設為abcde2345678gfynmnpwxkaptcha.textproducer.char.length 驗證碼文本字元長度 預設為5kaptcha.textproducer.font.names 驗證碼文本字型樣式 預設為new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)kaptcha.textproducer.font.size 驗證碼文本字元大小 預設為40kaptcha.textproducer.font.color 驗證碼文本字元顏色 預設為Color.BLACKkaptcha.textproducer.char.space 驗證碼文本字元間距 預設為2kaptcha.noise.impl 驗證碼噪點產生對象 預設為DefaultNoisekaptcha.noise.color 驗證碼噪點顏色 預設為Color.BLACKkaptcha.obscurificator.impl 驗證碼樣式引擎 預設為WaterRipplekaptcha.word.impl 驗證碼文本字元渲染 預設為DefaultWordRendererkaptcha.background.impl 驗證碼背景產生器 預設為DefaultBackgroundkaptcha.background.clear.from 驗證碼背景顏色漸進 預設為Color.LIGHT_GRAYkaptcha.background.clear.to 驗證碼背景顏色漸進 預設為Color.WHITEkaptcha.image.width 驗證碼圖片寬度 預設為200kaptcha.image.height 驗證碼圖片高度 預設為50
簡單的:
參考:http://blog.csdn.net/rambo_china/article/details/7720181
http://cuisuqiang.iteye.com/blog/2048428
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
java-captcha實現驗證碼(二)