kaptcha 驗證碼在spring mvc 中的使用
阿新 • • 發佈:2019-02-08
kaptcha 是一個非常實用的驗證碼生成工具。有了它,你可以生成各種樣式的驗證碼,因為它是可配置的。kaptcha工作的原理是呼叫 com.google.code.kaptcha.servlet.KaptchaServlet,生成一個圖片。同時將生成的驗證碼字串放到 HttpSession中。
使用kaptcha可以方便的配置:
- 驗證碼的字型
- 驗證碼字型的大小
- 驗證碼字型的字型顏色
- 驗證碼內容的範圍(數字,字母,中文漢字!)
- 驗證碼圖片的大小,邊框,邊框粗細,邊框顏色
-
驗證碼的干擾線(可以自己繼承com.google.code.kaptcha.NoiseProducer寫一個自定義的干擾線)
- 驗證碼的樣式(魚眼樣式、3D、普通模糊……當然也可以繼承com.google.code.kaptcha.GimpyEngine自定義樣式)
……
詳細資訊請看下面的web.xml檔案
下面介紹一下用法:
3.配置web.xml檔案
Xml程式碼- <!--Kaptcha 驗證碼 --><!--
- < servlet >
- < servlet-name > kaptcha</ servlet-name >
- <
servlet-class
>
com.google.code.kaptcha.servlet.KaptchaServlet</
- < init-param >
- < param-name > kaptcha.border</ param-name >
- < param-value > no</ param-value >
- </ init-param >
- < init-param >
- <
param-name
>
kaptcha.border.color</
- < 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.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 >
- < 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 > /ClinicCountManager/kaptcha.jpg</ url-pattern >
- lt;/servlet-mapping>
jsp 頁面使用
Java程式碼- <table>
- <tr>
- <td><img src="/ClinicCountManager/kaptcha.jpg"></td>
- <td valign="top">
- <form method="POST">
- <br>sec code:<input type="text" name="kaptchafield"><br />
- <input type="submit" name="submit">
- </form>
- </td>
- </tr>
- </table>
- <br /><br /><br /><br />
- <%
- String c = (String)session.getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);
- String parm = (String) request.getParameter("kaptchafield");
- out.println("Parameter: " + parm + " ? Session Key: " + c + " : ");
- if (c != null && parm != null ) {
- if (c.equals(parm)) {
- out.println("<b>true</b>");
- } else {
- out.println("<b>false</b>");
- }
- %>
上面的配置在普通jsp環境下面是有效的,如果在spring mvc環境下,則取不到session值,對於sping mvc環境驗證碼配置如下:
1.不用在web.xml進行相關配置,在applicationContext.xml中配置
Xml程式碼 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 ;
- }
- }
前臺呼叫方式
Java程式碼 Java程式碼- <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>
取驗證碼的方式
Java程式碼 Java程式碼- String code = (String)session.getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);