Spring mvc 中使用 kaptcha 驗證碼

jopen 10年前發布 | 283K 次閱讀 驗證碼 驗證碼(Captcha)

生成驗證碼的方式有很多,個人認為較為靈活方便的是Kaptcha ,他是基于SimpleCaptcha的開源項目。使用Kaptcha 生成驗證碼十分簡單并且參數可以進行自定義。只需添加jar包配置下就可以使用。kaptcha所有配置都可以通過web.xml來完成,如果項目使用了Spring MVC,那么實現方式會略有不同。

一、Servlet項目

1、添加jar包依賴

   maven項目,在pom.xml中添加dependency

<!-- kaptcha -->  
<dependency>  
    <groupId>com.google.code.kaptcha</groupId>  
    <artifactId>kaptcha</artifactId>  
    <version>2.3.2</version>  
</dependency>

  非maven項目,在官網下載kaptcha的jar包,然后添加到項目lib庫中。

  下載地址:http://code.google.com/p/kaptcha/downloads/list

2、配置web.xml

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

    注:url-pattern 自定義

    kaptcha的參數都有默認值,如果要配置kaptcha,在init-param增加響應的參數即可

<servlet>  
    <servlet-name>Kaptcha</servlet-name>  
    <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>  
    <init-param>  
        <param-name>kaptcha.image.width</param-name>  
        <param-value>200</param-value>  
        <description>Width in pixels of the kaptcha image.</description>  
    </init-param>  
    <init-param>  
        <param-name>kaptcha.image.height</param-name>  
        <param-value>50</param-value>  
        <description>Height in pixels of the kaptcha image.</description>  
    </init-param>  
    <init-param>  
        <param-name>kaptcha.textproducer.char.length</param-name>  
        <param-value>4</param-value>  
        <description>The number of characters to display.</description>  
    </init-param>  
    <init-param>  
        <param-name>kaptcha.noise.impl</param-name>  
        <param-value>com.google.code.kaptcha.impl.NoNoise</param-value>  
        <description>The noise producer.</description>  
    </init-param>  
</servlet>

3、jsp代碼

<script type="text/javascript"> 
$(function(){  //生成驗證碼         
    $('#kaptchaImage').click(function () {  
    $(this).hide().attr('src', '/code/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', '/code/captcha-image?' + Math.floor(Math.random()*100) ).fadeIn();  
    event.cancelBubble=true;  
}  
</script> 

<div class="form-group">  
   <label>驗證碼 </label> 
   <input name="j_code" type="text" id="kaptcha" maxlength="4" class="form-control" />
   <br/> 
   <img src="/code/captcha-image" id="kaptchaImage"  style="margin-bottom: -3px"/>       
   <a href="#" onclick="changeCode()">看不清?換一張</a>  
</div>

二、Spring mvc 中使用kaptcha

1、spring 配置文件 applicationContext.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">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>

2、Controller的實現

import java.awt.image.BufferedImage;  
import javax.imageio.ImageIO;  
import javax.servlet.ServletOutputStream;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import javax.servlet.http.HttpSession;   
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("/code")  
public class CaptchaController {  
      
    @Autowired  
    private Producer captchaProducer = null;  
  
    @RequestMapping(value = "captcha-image")  
    public ModelAndView getKaptchaImage(HttpServletRequest request, HttpServletResponse response) throws Exception {  
        HttpSession session = request.getSession();  
        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.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;  
    }  
}

3、kaptcha可配置項

kaptcha.border  是否有邊框  默認為true  我們可以自己設置yes,no  
kaptcha.border.color   邊框顏色   默認為Color.BLACK  
kaptcha.border.thickness  邊框粗細度  默認為1  
kaptcha.producer.impl   驗證碼生成器  默認為DefaultKaptcha  
kaptcha.textproducer.impl   驗證碼文本生成器  默認為DefaultTextCreator  
kaptcha.textproducer.char.string   驗證碼文本字符內容范圍  默認為abcde2345678gfynmnpwx  
kaptcha.textproducer.char.length   驗證碼文本字符長度  默認為5  
kaptcha.textproducer.font.names    驗證碼文本字體樣式  默認為new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)  
kaptcha.textproducer.font.size   驗證碼文本字符大小  默認為40  
kaptcha.textproducer.font.color  驗證碼文本字符顏色  默認為Color.BLACK  
kaptcha.textproducer.char.space  驗證碼文本字符間距  默認為2  
kaptcha.noise.impl    驗證碼噪點生成對象  默認為DefaultNoise  
kaptcha.noise.color   驗證碼噪點顏色   默認為Color.BLACK  
kaptcha.obscurificator.impl   驗證碼樣式引擎  默認為WaterRipple  
kaptcha.word.impl   驗證碼文本字符渲染   默認為DefaultWordRenderer  
kaptcha.background.impl   驗證碼背景生成器   默認為DefaultBackground  
kaptcha.background.clear.from   驗證碼背景顏色漸進   默認為Color.LIGHT_GRAY  
kaptcha.background.clear.to   驗證碼背景顏色漸進   默認為Color.WHITE  
kaptcha.image.width   驗證碼圖片寬度  默認為200  
kaptcha.image.height  驗證碼圖片高度  默認為50

 

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!