使用kaptcha可以方便的配置:
- 驗證碼的字體
- 驗證碼字體的大小
- 驗證碼字體的字體顏色
- 驗證碼內容的范圍(數字,字母,中文漢字!)
- 驗證碼圖片的大小,邊框,邊框粗細,邊框顏色
- 驗證碼的干擾線(可以自己繼承com.google.code.kaptcha.NoiseProducer寫一個自定義的干擾線)
- 驗證碼的樣式(魚眼樣式、3D、普通模糊……當然也可以繼承com.google.code.kaptcha.GimpyEngine自定義樣式)
……
詳細信息請看下面的web.xml文件
下面介紹一下用法:
1.首先去官網下載jar:http://code.google.com/p/kaptcha/
2.建立一個web項目,導入kaptcha-2.3.jar到環境變量中。
3.配置web.xml文件
<!-- Kaptcha驗證碼配置 --> <servlet> <servlet-name>Kaptcha</servlet-name> <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class> <init-param> <param-name>kaptcha.border</param-name> <param-value>no</param-value> </init-param> <init-param> <param-name>kaptcha.border.color</param-name> <param-value>105,179,90</param-value> </init-param> <init-param> <param-name>kaptcha.textproducer.font.color</param-name> <param-value>red</param-value> </init-param> <init-param> <param-name>kaptcha.obscurificator.impl</param-name> <param-value>com.google.code.kaptcha.impl.FishEyeGimpy</param-value> </init-param> <init-param> <param-name>kaptcha.image.width</param-name> <param-value>250</param-value> </init-param> <init-param> <param-name>kaptcha.image.height</param-name> <param-value>90</param-value> </init-param> <init-param> <param-name>kaptcha.textproducer.font.size</param-name> <param-value>70</param-value> </init-param> <init-param> <!-- String kaptchaExpected = (String) session.getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY); 必須改成 String kaptchaExpected = (String) session.getAttribute("code"); --> <param-name>kaptcha.session.key</param-name> <param-value>code</param-value> </init-param> <init-param> <param-name>kaptcha.textproducer.char.length</param-name> <param-value>4</param-value> </init-param> <init-param> <param-name>kaptcha.textproducer.font.names</param-name> <param-value>宋體,楷體,微軟雅黑</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>Kaptcha</servlet-name> <url-pattern>/kaptcha</url-pattern> </servlet-mapping>
4. jsp 頁面使用
<form class="m-t" role="form" id="loginform" method="post" action=""> <div class="form-group"><input class="form-control" name="userAccount" placeholder="用戶名" required=""></div> <div class="form-group"><input type="password" class="form-control" name="userPwd" placeholder="密碼" required=""></div> <input type="text" class="form-control login-yan-w" id="kaptcha" name="kaptcha" placeholder="驗證碼"> <span class="login-w"><img id="kaptchaImage" src="kaptcha"></span> <input type="button" class="btn btn-primary block full-width m-b" onclick="login()" value="登 錄"> </form>
function login(){ $.ajax({ cache: true, type: "POST", url:'${pageContext.request.contextPath}/login', data:$('#loginform').serialize(), dataType:'json', success: function(data) { if(data.status==200){ url="<%=request.getContextPath()%>/index.jsp"; window.location.href=url; }else{ alert(data.msg) } }, error: function(){ alert("請檢查用戶賬戶或密碼"); } }); }
5. 如果想設置點擊圖片更換驗證碼,可以加上如下js
<script type="text/javascript"> //點擊圖片驗證碼進行更新 $(function(){ $('#kaptchaImage').click(function () { $(this).attr('src', 'kaptcha?' + Math.floor(Math.random()*100) ); }) }); </script>
5. KaptchaServlet會把驗證碼設置到session中,在Controller可以如下方式獲取
@RequestMapping("/login") @ResponseBody public CRMResult login(HttpServletRequest request ,HttpSession session) { String kaptcha = request.getParameter("kaptcha"); String kaptchaExpected = (String) session.getAttribute("code"); System.out.println(kaptcha +"......"+kaptchaExpected); if (!kaptcha.equalsIgnoreCase(kaptchaExpected)) { return CRMResult.build(201, "驗證碼填寫錯誤"); } return CRMResult.ok(); }
上面的配置在普通jsp環境下面是有效的,如果在spring mvc環境下,則取不到session值,對於sping mvc環境驗證碼配置如下:
1.不用在web.xml進行相關配置,在springmvc.xml中配置
<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">no</prop> <prop key="kaptcha.border.color">105,179,90</prop> <prop key="kaptcha.textproducer.font.color">red</prop> <prop key="kaptcha.image.width">250</prop> <prop key="kaptcha.textproducer.font.size">90</prop> <prop key="kaptcha.image.height">90</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>
Java代碼
import java.awt.image.BufferedImage; import javax.imageio.ImageIO; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import com.google.code.kaptcha.Constants; import com.google.code.kaptcha.Producer; @Controller @RequestMapping("/") public class CaptchaImageCreateController { private Producer captchaProducer = null; @Autowired public void setCaptchaProducer(Producer captchaProducer) { this.captchaProducer = captchaProducer; } @RequestMapping("/captcha-image") public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { response.setDateHeader("Expires", 0); // Set standard HTTP/1.1 no-cache headers. response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate"); // Set IE extended HTTP/1.1 no-cache headers (use addHeader). response.addHeader("Cache-Control", "post-check=0, pre-check=0"); // Set standard HTTP/1.0 no-cache header. response.setHeader("Pragma", "no-cache"); // return a jpeg response.setContentType("image/jpeg"); // create the text for the image String capText = captchaProducer.createText(); // store the text in the session request.getSession().setAttribute(Constants.KAPTCHA_SESSION_KEY, capText); // create the image with the text BufferedImage bi = captchaProducer.createImage(capText); ServletOutputStream out = response.getOutputStream(); // write the data out ImageIO.write(bi, "jpg", out); try { out.flush(); } finally { out.close(); } return null; } }
前台調用方式
<div class="chknumber"> <label>驗證碼: <input name="kaptcha" type="text" id="kaptcha" maxlength="4" class="chknumber_input" /> </label> <img src="/ClinicCountManager/captcha-image.do" width="55" height="20" id="kaptchaImage" style="margin-bottom: -3px"/> <script type="text/javascript"> $(function(){ $('#kaptchaImage').click(function () {//生成驗證碼 $(this).hide().attr('src', '/ClinicCountManager/captcha-image.do?' + Math.floor(Math.random()*100) ).fadeIn(); }) }); </script> </div>
取驗證碼的方式
String code = (String)session.getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);
如果需要全部數字
<init-param> <param-name>kaptcha.textproducer.char.string</param-name> <param-value>0123456789</param-value> </init-param>
去掉干擾線
<init-param> <param-name>kaptcha.noise.impl</param-name> <param-value>com.google.code.kaptcha.impl.NoNoise </param-value> </init-param>