popcorn丫

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

pom.xml引入依赖

<dependency>  
        <groupId>com.octo.captcha</groupId>  
        <artifactId>jcaptcha-all</artifactId>  
        <version>1.0-RC6</version>  
        <exclusions>  
            <exclusion>  
                <groupId>quartz</groupId>  
                <artifactId>quartz</artifactId>  
            </exclusion>  
            <exclusion>  
                <groupId>commons-dbcp</groupId>  
                <artifactId>commons-dbcp</artifactId>  
            </exclusion>  
            <exclusion>  
                <groupId>commons-pool</groupId>  
                <artifactId>commons-pool</artifactId>  
                </exclusion>  
            <exclusion>  
                <groupId>hsqldb</groupId>  
                <artifactId>hsqldb</artifactId>  
            </exclusion>  
            <exclusion>  
                <groupId>net.sf.ehcache</groupId>  
                <artifactId>ehcache</artifactId>  
            </exclusion>  
            <exclusion>  
                <groupId>concurrent</groupId>  
                <artifactId>concurrent</artifactId>  
            </exclusion>  
            <exclusion>  
                <groupId>org.springframework</groupId>  
                <artifactId>spring</artifactId>  
            </exclusion>  
            <exclusion>  
                <groupId>xerces</groupId>  
                <artifactId>xercesImpl</artifactId>  
            </exclusion>  
            <exclusion>  
                <groupId>xerces</groupId>  
                <artifactId>xmlParserAPIs</artifactId>  
            </exclusion>  
        </exclusions>  
    </dependency>

定义验证码使用的服务类(这里使用单例定义该服务类):

package com.trustel.common;

import java.awt.Color;
import java.awt.Font;

import com.octo.captcha.component.image.backgroundgenerator.BackgroundGenerator;
import com.octo.captcha.component.image.backgroundgenerator.UniColorBackgroundGenerator;
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.multitype.GenericManageableCaptchaService;


public class CaptchaUtil{
    private static GenericManageableCaptchaService imageCaptchaService = null;
    
    public static GenericManageableCaptchaService getInstance(){
        if(imageCaptchaService == null){
            imageCaptchaService = generateImageCaptchaService();
        }
        return imageCaptchaService;
    }
    
    public static GenericManageableCaptchaService generateImageCaptchaService(){
        Integer WIDTH = 60;//验证码宽
        Integer HEIGHT = 25;//验证码高
        Integer MINLENGTH = 4;//字符最短
        Integer MAXLENGTH = 4;//字符最长
        Integer MINFONTSIZE = 10;//字符最小
        Integer MAXFONTSIZE = 15;//字符最大
        Integer LIVETIME = 5*60;//验证码存活时间
        Integer MAXCAPTCHASTORESIZE = 200000;//最大存储大小
        //随机颜色
//        RandomRangeColorGenerator textColor = new RandomRangeColorGenerator(new int[]{0,0},new int[]{0,0},new int[]{0,0},new int[]{255,255});
        //验证码字符
//        RandomTextPaster randomTextPaster = new RandomTextPaster(MINLENGTH, MAXLENGTH, textColor,true);
        RandomTextPaster randomTextPaster = new RandomTextPaster(MINLENGTH, MAXLENGTH, Color.gray);

        //背景(渐变色)
//        BackgroundGenerator colorbgGen = new GradientBackgroundGenerator(WIDTH, HEIGHT,new Color(46,195,231),Color.WHITE);
         //背景大小及样式设置,UniColorBackgroundGenerator类生成的是统一背景,这里背景统一是lightGray颜色 
          //宽度为180,高度为50。 
          BackgroundGenerator colorbgGen = new UniColorBackgroundGenerator(WIDTH, HEIGHT);
         /* //FunkyBackgroundGenerator类生成的是炫酷背景 
          BackgroundGenerator back = new  FunkyBackgroundGenerator(new Integer( 
            180), new Integer(50));*/  
        
        //随机生成的字体大小和字体类型
        RandomFontGenerator randomFontGenerator = new RandomFontGenerator(MINFONTSIZE, MAXFONTSIZE, new Font[]{new Font("Arial", 0, 10),new Font("Tahoma",0,10)});
        //生成图片对象
        ComposedWordToImage cwti = new ComposedWordToImage(randomFontGenerator,colorbgGen,randomTextPaster);
        //随机文本的字典
        ComposeDictionaryWordGenerator cdwg = new ComposeDictionaryWordGenerator(new FileDictionary("toddlist"));
        GimpyFactory gf = new GimpyFactory(cdwg, cwti);
        
        GenericCaptchaEngine gce = new GenericCaptchaEngine(new GimpyFactory[]{gf});
        //返回一个对象,
        return new GenericManageableCaptchaService(gce, LIVETIME, MAXCAPTCHASTORESIZE);
    }
    
    public static Boolean validateCaptcha(String id,String captcha){
        boolean isValid = false;
        isValid = getInstance().validateResponseForID(id, captcha).booleanValue();
        return isValid;
    }
    
}

产生验证码:

如果是spring的话,在controller中定义产生验证码的方法:

@GetMapping("/captcha")
    public void getCaptcha(HttpServletRequest request,HttpServletResponse response){
        response.setHeader("Cache-Control", "no-store");
        response.setHeader("Pragma", "no-cache");
        response.setDateHeader("Expires", 0);
        response.setContentType("image/jpeg");
        
        BufferedImage bi = CaptchaUtil.getInstance().getImageChallengeForID(request.getSession(true).getId());
        try {
            ServletOutputStream out = response.getOutputStream();
            ImageIO.write(bi, "jpg", out);
            try{
                out.flush();
            }finally{
                out.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } 
    }

在前端页面定义验证码产生的位置

...
<input id="yzm" type="text" maxlength="4" name="captcha" placeholder="验证码">
<img id="captcha" class="code-pic" style="cursor: pointer;" alt="验证码" src="<%=basePath %>/sys/captcha">
...
<script type="text/javascript">
$("#captcha").bind('click',function(){
    $("#captcha").prop("src",'<%=basePath %>/sys/captcha');
})
</script>

检验验证码:

...
String captchaValue= request.getParameter("captcha");//request获得验证码
Boolean isValid=CaptchaUtil.validateCaptcha(request.getSession(true).getId(), captchaValue);//CaptchaUtil的validCaptcha方法检验验证码的正误
if(isValid){
//doSomeThing,执行验证码通过的操作    
}else{
return "/login";//返回登录页面
}
...

 

posted on 2017-11-24 10:06  popcorn丫  阅读(637)  评论(0编辑  收藏  举报