jcaptcha和kaptcha驗證碼使用入門【轉】


jcaptcha和kaptcha驗證碼使用入門

一、jcaptcha驗證碼使用

jcaptcha使用默認樣式生成的驗證碼比較難以識別,所以需要自定義驗證碼的樣式,包括,背景色、背景大小、字體、字體大小、生成的字符數等。相對與kaptcha比較復雜。

1.1、純代碼實現jcaptcha驗證碼

1、首先創建一個javaWeb工程添加jcaptcha包和它所依賴的包,添加完成后:

 

2、創建一個jcaptcha單例的Service類,這里是設置驗證碼樣式的關鍵部分,代碼如下:

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);
    }
}

 

每一句代碼都有注釋,這里就不多說了。

3、創建一個生成驗證碼的Servlet,代碼如下:

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();
    }
}

 

4、在Web.xml中注冊這個Servlet,代碼如下:

<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>

 

5、編寫一個使用驗證碼的頁面,代碼如下:

<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>

 

 

6、編寫一個驗證Servlet並在web.xml中注冊,代碼分別如下:

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>

 

 

7、運行會看到驗證碼如下:

 

8、輸入驗證碼點擊提交,看是否可以驗證通過,如果一切正常的話Session中的和提交的是一致的。

1.2、使用Spring配置jcaptha驗證碼

1、創建一個javaWeb工程並加入Spring和jcaptcha的包。添加完成后的包依賴如下:

2、在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>

 


3、在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>

 


各種配置與代碼實現是一樣的,每個配置中都有注釋。

4、  編寫一個生成驗證碼的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();
    }
}

 


5、在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>

 


6、驗證步驟與代碼實現一樣,請大家自行編寫。

二、kaptcha驗證碼使用

個人感覺kaptcha使用比jcaptcha相對簡單。

1、在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:產生圖片的高度,等

2、編寫一個顯示驗證碼的頁面,代碼如下:

<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>

 


3、運行頁面顯示如下:

 

4、  編寫一個驗證的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");
        }
    }
}

 


三、總結:

到處jcaptcha和kaptcha的驗證代碼就編寫完成了,寫的還比較淺顯。希望對需要這兩個驗證碼包的朋友有所幫助,也是給自己一個備忘。

全引用自: 此條目由zyw090111發表在Spring分類目錄,並貼了jcaptchakaptcha驗證碼標簽。將固定鏈接加入收藏夾。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM