1、jcaptcha驗證碼使用
jcaptcha使用默認樣式生成的驗證碼比較難以識別,因此須要自定義驗證碼的樣式,包括,背景色、背景大小、字體、字體大小、生成的字符數等。相對與kaptcha比較複雜。html
1.一、純代碼實現jcaptcha驗證碼
一、首先建立一個javaWeb工程添加jcaptcha包和它所依賴的包,添加完成後:java
二、建立一個jcaptcha單例的Service類,這裏是設置驗證碼樣式的關鍵部分,代碼以下:web
package cn.v5cn.jcaptchatest.custom; import java.awt.Font; import com.octo.captcha.CaptchaFactory; import com.octo.captcha.component.image.backgroundgenerator.UniColorBackgroundGenerator; import com.octo.captcha.component.image.color.RandomRangeColorGenerator; import com.octo.captcha.component.image.fontgenerator.RandomFontGenerator; import com.octo.captcha.component.image.textpaster.RandomTextPaster; import com.octo.captcha.component.image.wordtoimage.ComposedWordToImage; import com.octo.captcha.component.word.FileDictionary; import com.octo.captcha.component.word.wordgenerator.ComposeDictionaryWordGenerator; import com.octo.captcha.engine.GenericCaptchaEngine; import com.octo.captcha.image.gimpy.GimpyFactory; import com.octo.captcha.service.image.ImageCaptchaService; import com.octo.captcha.service.multitype.GenericManageableCaptchaService; public class CaptchaServiceSingleton { private static ImageCaptchaService service = null; public static ImageCaptchaService getService(){ if(service == null) service = generatorCaptchaService(); return service; } /** * 根據SpringBean的配置文件編寫的代碼實現 * */ public static ImageCaptchaService generatorCaptchaService(){ //生成隨機顏色,參數分別表示RGBA的取值範圍 RandomRangeColorGenerator textColor = new RandomRangeColorGenerator(new int[]{0,255},new int[]{0,180},new int[]{0,210},new int[]{255,255}); //隨機文字多少和顏色,參數1和2表示最少生成多少個文字和最多生成多少個 RandomTextPaster randomTextPaster = new RandomTextPaster(4, 5, textColor,true); //生成背景的大小這裏是寬85高40的圖片,也能夠設置背景顏色和隨機背景顏色,這裏使用默認的白色 UniColorBackgroundGenerator colorbgGen = new UniColorBackgroundGenerator(85,40); //隨機生成的字體大小和字體類型,參數1和2表示最小和最大的字體大小,第三個表示隨機的字體 RandomFontGenerator randomFontGenerator = new RandomFontGenerator(20, 25, new Font[]{new Font("Arial", 0, 10),new Font("Tahoma",0,10)}); //結合上面的對象構件一個從文本生成圖片的對象 ComposedWordToImage cwti = new ComposedWordToImage(randomFontGenerator,colorbgGen,randomTextPaster); //隨機文本的字典,這裏是使用jcaptcha-1.0-all.jar中的文本字典,字典名稱爲toddlist.properties ComposeDictionaryWordGenerator cdwg = new ComposeDictionaryWordGenerator(new FileDictionary("toddlist")); GimpyFactory gf = new GimpyFactory(cdwg, cwti); GenericCaptchaEngine gce = new GenericCaptchaEngine(new CaptchaFactory[]{gf}); //返回一個Service對象,這裏180是驗證碼存在的時間,單位是秒,200000是最大存儲大小 return new GenericManageableCaptchaService(gce,180,200000,75000); } }
每一句代碼都有註釋,這裏就很少說了。spring
三、建立一個生成驗證碼的Servlet,代碼以下:app
package cn.v5cn.jcaptchatest.custom; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageEncoder; public class CustomServlet extends HttpServlet { private static final long serialVersionUID = 169310818225761427L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { byte[] captChallengeAsJpeg = null; ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream(); String captchaId = req.getSession().getId(); BufferedImage challenge = CaptchaServiceSingleton.getService().getImageChallengeForID(captchaId,req.getLocale()); JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(jpegOutputStream); jpegEncoder.encode(challenge); captChallengeAsJpeg = jpegOutputStream.toByteArray(); resp.setHeader("Cache-Control", "no-store"); resp.setHeader("Pragma", "no-cache"); resp.setDateHeader("Expires", 0); resp.setContentType("image/jpeg"); ServletOutputStream respOutputStream = resp.getOutputStream(); respOutputStream.write(captChallengeAsJpeg); respOutputStream.flush(); respOutputStream.close(); } }
四、在Web.xml中註冊這個Servlet,代碼以下:dom
<servlet> <servlet-name>generateValidateCode</servlet-name> <servlet-class>cn.v5cn.jcaptchatest.custom.CustomServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>generateValidateCode</servlet-name> <url-pattern>/cgvc</url-pattern> </servlet-mapping>
五、編寫一個使用驗證碼的頁面,代碼以下:ide
<form action="valiServlet" method="post"> <input type="text" name="customgvc"> <img id="vcode" title="點擊更換" alt="驗證圖片" style="vertical-align: middle;" src="cgvc" height="30" width="80"> <input type="submit" value="提交"> </form>
六、編寫一個驗證Servlet並在web.xml中註冊,代碼分別以下:post
package cn.v5cn.jcaptchatest.custom; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ValidateServlet extends HttpServlet { private static final long serialVersionUID = -7173743572400866269L; @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String captchaId = req.getSession().getId(); String validateCode = req.getParameter("customgvc"); boolean validateResult = CaptchaServiceSingleton.getService().validateResponseForID(captchaId, validateCode); if(validateResult) resp.sendRedirect("success.html"); else resp.sendRedirect("fail.html"); } }
<servlet> <servlet-name>validatServlet</servlet-name> <servlet-class>cn.v5cn.jcaptchatest.custom.ValidateServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>validatServlet</servlet-name> <url-pattern>/valiServlet</url-pattern> </servlet-mapping>
七、運行會看到驗證碼以下:字體
八、輸入驗證碼點擊提交,看是否能夠驗證經過,若是一切正常的話Session中的和提交的是一致的。google
1.二、使用Spring配置jcaptha驗證碼
一、建立一個javaWeb工程並加入Spring和jcaptcha的包。添加完成後的包依賴以下:
二、在web.xml中配置Spring代碼以下:
<context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/spring-jcaptcha.xml </param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
三、在WEB-INF中建立spring-jcaptcha.xml的SpringBean配置文件,代碼以下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"> <!-- 構建生成圖片服務 --> <bean id="imageCaptchaService" class="com.octo.captcha.service.multitype.GenericManageableCaptchaService"> <constructor-arg index="0" ref="imageEngine"/> <constructor-arg index="1" value="180"/> <constructor-arg index="2" value="200000"/> <constructor-arg index="3" value="75000"/> </bean> <!-- 構建生成圖片引擎,能夠傳入多個ImageCaptchaFactory工廠 --> <bean id="imageEngine" class="com.octo.captcha.engine.GenericCaptchaEngine"> <constructor-arg index="0"> <list> <ref bean="imageCaptchaFactory"/> </list> </constructor-arg> </bean> <!-- 構件圖片工廠 ,圖片工廠包括FishEyeFactory和GimpyFactory 它們都繼承自ImageCaptchaFactory抽象類--> <bean id="imageCaptchaFactory" class="com.octo.captcha.image.gimpy.GimpyFactory" > <constructor-arg><ref bean="wordgen"/></constructor-arg> <constructor-arg><ref bean="wordtoimage"/></constructor-arg> </bean> <!-- 構件驗證碼上的文本生成類 --> <bean id="wordgen" class="com.octo.captcha.component.word.wordgenerator.ComposeDictionaryWordGenerator" > <constructor-arg index="0" ref="filedict"/> </bean> <!-- 構件文件字典類,讀取文件字典 。該文件字典包含在jcaptcha-1.0-all.jar 包的toddlist.properties 文件--> <bean id="filedict" class="com.octo.captcha.component.word.FileDictionary" > <constructor-arg index="0" value="toddlist"/> </bean> <!-- 構件一個從文本到圖片的生成類 --> <bean id="wordtoimage" class="com.octo.captcha.component.image.wordtoimage.ComposedWordToImage" > <constructor-arg index="0"><ref bean="fontGenRandom"/></constructor-arg> <constructor-arg index="1"><ref bean="backGenUni"/></constructor-arg> <constructor-arg index="2"><ref bean="simpleColoredPaster"/></constructor-arg> </bean> <!-- 構件一個生成隨機字體的類 。第一個參數是最小字體大小,第二個參數是最大字體大小,第三個參數是隨機的字體列表 這裏定義了5種類型的字體 --> <bean id="fontGenRandom" class="com.octo.captcha.component.image.fontgenerator.RandomFontGenerator" > <constructor-arg index="0"><value>20</value></constructor-arg> <constructor-arg index="1"><value>25</value></constructor-arg> <constructor-arg index="2"> <list> <bean class="java.awt.Font"> <constructor-arg index="0" value="Arial"/> <constructor-arg index="1" value="0"/> <constructor-arg index="2" value="10"/> </bean> <bean class="java.awt.Font" > <constructor-arg index="0" value="Tahoma"/> <constructor-arg index="1" value="1"/> <constructor-arg index="2" value="10"/> </bean> <bean class="java.awt.Font" > <constructor-arg index="0" value="Verdana"/> <constructor-arg index="1" value="0"/> <constructor-arg index="2" value="10"/> </bean> <bean class="java.awt.Font" > <constructor-arg index="0" value="Comic sans MS"/> <constructor-arg index="1" value="0"/> <constructor-arg index="2" value="10"/> </bean> <bean class="java.awt.Font" > <constructor-arg index="0" value="Lucida console"/> <constructor-arg index="1" value="0"/> <constructor-arg index="2" value="10"/> </bean> </list> </constructor-arg> </bean> <!-- 構件一個背景大小生成類 ,第一個參數是背景寬度,第二個參數是背景高度--> <bean id="backGenUni" class="com.octo.captcha.component.image.backgroundgenerator.UniColorBackgroundGenerator" > <constructor-arg index="0"><value>85</value></constructor-arg> <constructor-arg index="1"><value>40</value></constructor-arg> </bean> <!-- 構件一個隨機文本個數和顏色,第一個參數是最少文本個數,第二個參數是最多文本個數 --> <bean id="simpleColoredPaster" class="com.octo.captcha.component.image.textpaster.RandomTextPaster" > <constructor-arg index="0" value="4"/> <constructor-arg index="1" value="5"/> <constructor-arg type="com.octo.captcha.component.image.color.ColorGenerator" index="2" ref="colorGenRandomDark"/> <constructor-arg index="3" value="true"/> </bean> <!-- 構件一個隨機的顏色,參數分別表明RGBA通道的取值範圍 --> <bean id="colorGenRandomDark" class="com.octo.captcha.component.image.color.RandomRangeColorGenerator" > <constructor-arg index="0"> <list> <value>0</value> <value>255</value> </list> </constructor-arg> <constructor-arg index="1"> <list> <value>0</value> <value>185</value> </list> </constructor-arg> <constructor-arg index="2"> <list> <value>0</value> <value>200</value> </list> </constructor-arg> <constructor-arg index="3"> <list> <value>255</value> <value>255</value> </list> </constructor-arg> </bean> </beans>
各類配置與代碼實現是同樣的,每一個配置中都有註釋。
四、 編寫一個生成驗證碼的Servlet,代碼以下:
package cn.v5cn.jcaptchatest.spring; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; import com.octo.captcha.service.CaptchaServiceException; import com.octo.captcha.service.image.ImageCaptchaService; public class JcaptchaServlet extends HttpServlet { private static final long serialVersionUID = -8021621053846019170L; public static final String CAPTCHA_IMAGE_FORMAT = "jpeg"; private ImageCaptchaService captchaService; @Override public void init() throws ServletException { WebApplicationContext appCtx = WebApplicationContextUtils.getWebApplicationContext(getServletContext()); captchaService = (ImageCaptchaService) BeanFactoryUtils.beanOfTypeIncludingAncestors(appCtx, ImageCaptchaService.class); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { byte[] captchaChallengeAsJpeg = null; ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream(); try { String captchaId = request.getSession().getId(); BufferedImage challenge = captchaService.getImageChallengeForID( captchaId, request.getLocale()); ImageIO.write(challenge, CAPTCHA_IMAGE_FORMAT, jpegOutputStream); } catch (IllegalArgumentException e) { response.sendError(HttpServletResponse.SC_NOT_FOUND); return; } catch (CaptchaServiceException e) { response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); return; } captchaChallengeAsJpeg = jpegOutputStream.toByteArray(); // flush it in the response response.setHeader("Cache-Control", "no-store"); response.setHeader("Pragma", "no-cache"); response.setDateHeader("Expires", 0); response.setContentType("image/" + CAPTCHA_IMAGE_FORMAT); ServletOutputStream responseOutputStream = response.getOutputStream(); responseOutputStream.write(captchaChallengeAsJpeg); responseOutputStream.flush(); responseOutputStream.close(); } }
五、在web.xml中註冊這Servlet,代碼以下:
<servlet> <servlet-name>springCaptcha</servlet-name> <servlet-class>cn.v5cn.jcaptchatest.spring.JcaptchaServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>springCaptcha</servlet-name> <url-pattern>/scgvc</url-pattern> </servlet-mapping>
六、驗證步驟與代碼實現同樣,請你們自行編寫。
2、kaptcha驗證碼使用
我的感受kaptcha使用比jcaptcha相對簡單。
一、在Servelt中配置kaptcha的Servlet,代碼以下:
<!-- 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.textproducer.font.color</param-name> <param-value>black</param-value> </init-param> <init-param> <param-name>kaptcha.textproducer.char.space</param-name> <param-value>5</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>kaptcha</servlet-name> <url-pattern>/kaptcha.jpg</url-pattern> </servlet-mapping>
kaptcha.border:是否顯示邊框。
kaptcha.textproducer.font.color:字體顏色
kaptcha.textproducer.char.space:字符間距
更多的屬性設置能夠在com.google.code.kaptcha.Constants類中找到。其中包括:
kaptcha.border.color:邊框顏色
kaptcha.border.thickness:邊框寬度
kaptcha.textproducer.char.length:產生字符的長度
kaptcha.textproducer.font.size:產生字符的大小
kaptcha.image.width:產生圖片的寬度
kaptcha.image.height:產生圖片的高度,等
二、編寫一個顯示驗證碼的頁面,代碼以下:
<form action="kaptcha" method="post"> <input type="text" name="kaptchaValidate"> <img id="vcode" style="vertical-align: middle;" title="點擊更換" alt="驗證圖片" src="kaptcha.jpg" height="40" width="85"> <input type="submit" value="提交"> </form>
三、運行頁面顯示以下:
四、 編寫一個驗證的Servelt,代碼以下:
package cn.v5cn.kaptcha; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.google.code.kaptcha.Constants; public class KaptchaValidateServlet extends HttpServlet { private static final long serialVersionUID = -7642000788132875193L; @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String validate = req.getParameter("kaptchaValidate"); String validateCode = (String) req.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY); if(validate==null || validateCode == null){ resp.sendRedirect("fail.html"); }else if(!validateCode.equals(validate)){ resp.sendRedirect("fail.html"); }else{ resp.sendRedirect("success.html"); } } }
3、總結:
處處jcaptcha和kaptcha的驗證代碼就編寫完成了,寫的還比較淺顯。但願對須要這兩個驗證碼包的朋友有所幫助,也是給本身一個備忘。
全引用自: 此條目由zyw090111發表在Spring分類目錄,並貼了jcaptcha、kaptcha、驗證碼標籤。將固定連接加入收藏夾。