转自:http://my.oschina.net/CandyDesire/blog/209364

 

生成验证码的方式有很多,个人认为较为灵活方便的是Kaptcha ,他是基于SimpleCaptcha的开源项目。使用Kaptcha 生成验证码十分简单并且参数可以进行自定义。只需添加jar包配置下就可以使用。kaptcha所有配置都可以通过web.xml来完成,如果项目使用了Spring MVC,那么实现方式会略有不同。

一、Servlet项目

1、添加jar包依赖

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

?
1
2
3
4
5
6
<!-- 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

?
1
2
3
4
5
6
7
8
<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增加响应的参数即可

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<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代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<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的实现

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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可配置项

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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

 

转载于:https://www.cnblogs.com/laobiao/p/5476105.html

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐