文档章节

Java里使用patchca生成验证码

easonwang
 easonwang
发布于 2014/04/14 16:38
字数 826
阅读 3937
收藏 17

Patchca是Piotr Piastucki写的一个java验证码开源库,打包成jar文件发布,patchca使用简单但功能强大。

本例实现了自定义背景,由于生成图片较小,波动太大时会导致部分文字显示不全,所以更改了滤镜属性。

效果图:

代码如下:

[java] view plaincopy

  1. package com.ninemax.cul.servlet;  

  2.   

  3. import java.awt.Color;  

  4. import java.awt.Graphics;  

  5. import java.awt.image.BufferedImage;  

  6. import java.awt.image.BufferedImageOp;  

  7. import java.io.IOException;  

  8. import java.io.OutputStream;  

  9. import java.util.ArrayList;  

  10. import java.util.List;  

  11. import java.util.Random;  

  12.   

  13. import javax.imageio.ImageIO;  

  14. import javax.servlet.ServletException;  

  15. import javax.servlet.http.HttpServlet;  

  16. import javax.servlet.http.HttpServletRequest;  

  17. import javax.servlet.http.HttpServletResponse;  

  18. import javax.servlet.http.HttpSession;  

  19.   

  20. import org.patchca.background.BackgroundFactory;  

  21. import org.patchca.color.ColorFactory;  

  22. import org.patchca.color.RandomColorFactory;  

  23. import org.patchca.filter.ConfigurableFilterFactory;  

  24. import org.patchca.filter.library.AbstractImageOp;  

  25. import org.patchca.filter.library.WobbleImageOp;  

  26. import org.patchca.font.RandomFontFactory;  

  27. import org.patchca.service.Captcha;  

  28. import org.patchca.service.ConfigurableCaptchaService;  

  29. import org.patchca.text.renderer.BestFitTextRenderer;  

  30. import org.patchca.text.renderer.TextRenderer;  

  31. import org.patchca.word.RandomWordFactory;  

  32.   

  33. /**  

  34.  * 验证码生成类  

  35.  *  

  36.  * 使用开源验证码项目patchca生成  

  37.  * 依赖jar包:patchca-0.5.0.jar  

  38.  * 项目网址:https://code.google.com/p/patchca/  

  39.  *  

  40.  * @author zyh 

  41.  * @version 1.00  2012-7-12 New  

  42.  */  

  43. public class ValidationCodeServlet extends HttpServlet {  

  44.     private static final long serialVersionUID = 5126616339795936447L;  

  45.       

  46.     private ConfigurableCaptchaService configurableCaptchaService = null;  

  47.     private ColorFactory colorFactory = null;  

  48.     private RandomFontFactory fontFactory = null;  

  49.     private RandomWordFactory wordFactory = null;  

  50.     private TextRenderer textRenderer = null;  

  51.       

  52.     public ValidationCodeServlet() {  

  53.         super();  

  54.     }  

  55.   

  56.     /** 

  57.      * Servlet销毁方法,负责销毁所使用资源. <br> 

  58.      */  

  59.     public void destroy() {  

  60.         wordFactory = null;  

  61.         colorFactory = null;  

  62.         fontFactory = null;  

  63.         textRenderer = null;  

  64.         configurableCaptchaService = null;  

  65.         super.destroy(); // Just puts "destroy" string in log  

  66.     }  

  67.   

  68.     public void doGet(HttpServletRequest request, HttpServletResponse response)  

  69.             throws ServletException, IOException {  

  70.         doPost(request, response);  

  71.     }  

  72.   

  73.     public void doPost(HttpServletRequest request, HttpServletResponse response)  

  74.             throws ServletException, IOException {  

  75.         response.setContentType("image/png");  

  76.         response.setHeader("cache""no-cache");  

  77.           

  78.         HttpSession session = request.getSession(true);  

  79.         OutputStream outputStream = response.getOutputStream();  

  80.           

  81.         // 得到验证码对象,有验证码图片和验证码字符串  

  82.         Captcha captcha = configurableCaptchaService.getCaptcha();  

  83.         // 取得验证码字符串放入Session  

  84.         String validationCode = captcha.getChallenge();  

  85.         session.setAttribute("validationCode", validationCode);  

  86.         // 取得验证码图片并输出  

  87.         BufferedImage bufferedImage = captcha.getImage();  

  88.         ImageIO.write(bufferedImage, "png", outputStream);  

  89.           

  90.         outputStream.flush();  

  91.         outputStream.close();  

  92.     }  

  93.   

  94.     /** 

  95.      * Servlet初始化方法 

  96.      */  

  97.     public void init() throws ServletException {  

  98.         configurableCaptchaService = new ConfigurableCaptchaService();  

  99.           

  100.         // 颜色创建工厂,使用一定范围内的随机色  

  101.         colorFactory = new RandomColorFactory();  

  102.         configurableCaptchaService.setColorFactory(colorFactory);  

  103.           

  104.         // 随机字体生成器  

  105.         fontFactory = new RandomFontFactory();  

  106.         fontFactory.setMaxSize(32);  

  107.         fontFactory.setMinSize(28);  

  108.         configurableCaptchaService.setFontFactory(fontFactory);  

  109.           

  110.         // 随机字符生成器,去除掉容易混淆的字母和数字,如o和0等  

  111.         wordFactory = new RandomWordFactory();  

  112.         wordFactory.setCharacters("abcdefghkmnpqstwxyz23456789");  

  113.         wordFactory.setMaxLength(5);  

  114.         wordFactory.setMinLength(4);  

  115.         configurableCaptchaService.setWordFactory(wordFactory);  

  116.           

  117.         // 自定义验证码图片背景  

  118.         MyCustomBackgroundFactory backgroundFactory = new MyCustomBackgroundFactory();  

  119.         configurableCaptchaService.setBackgroundFactory(backgroundFactory);  

  120.           

  121.         // 图片滤镜设置  

  122.         ConfigurableFilterFactory filterFactory = new ConfigurableFilterFactory();  

  123.           

  124.         List<BufferedImageOp> filters = new ArrayList<BufferedImageOp>();  

  125.         WobbleImageOp wobbleImageOp = new WobbleImageOp();  

  126.         wobbleImageOp.setEdgeMode(AbstractImageOp.EDGE_MIRROR);  

  127.         wobbleImageOp.setxAmplitude(2.0);  

  128.         wobbleImageOp.setyAmplitude(1.0);  

  129.         filters.add(wobbleImageOp);  

  130.         filterFactory.setFilters(filters);  

  131.           

  132.         configurableCaptchaService.setFilterFactory(filterFactory);  

  133.           

  134.         // 文字渲染器设置  

  135.         textRenderer = new BestFitTextRenderer();  

  136.         textRenderer.setBottomMargin(3);  

  137.         textRenderer.setTopMargin(3);  

  138.         configurableCaptchaService.setTextRenderer(textRenderer);  

  139.           

  140.         // 验证码图片的大小  

  141.         configurableCaptchaService.setWidth(82);  

  142.         configurableCaptchaService.setHeight(32);  

  143.     }  

  144.       

  145.     /** 

  146.      * 自定义验证码图片背景,主要画一些噪点和干扰线 

  147.      */  

  148.     private class MyCustomBackgroundFactory implements BackgroundFactory {  

  149.         private Random random = new Random();  

  150.   

  151.         public void fillBackground(BufferedImage image) {  

  152.             Graphics graphics = image.getGraphics();  

  153.               

  154.             // 验证码图片的宽高  

  155.             int imgWidth = image.getWidth();  

  156.             int imgHeight = image.getHeight();  

  157.               

  158.             // 填充为白色背景  

  159.             graphics.setColor(Color.WHITE);  

  160.             graphics.fillRect(00, imgWidth, imgHeight);  

  161.               

  162.             // 画100个噪点(颜色及位置随机)  

  163.             for(int i = 0; i < 100; i++) {  

  164.                 // 随机颜色  

  165.                 int rInt = random.nextInt(255);  

  166.                 int gInt = random.nextInt(255);  

  167.                 int bInt = random.nextInt(255);  

  168.                   

  169.                 graphics.setColor(new Color(rInt, gInt, bInt));  

  170.                   

  171.                 // 随机位置  

  172.                 int xInt = random.nextInt(imgWidth - 3);  

  173.                 int yInt = random.nextInt(imgHeight - 2);  

  174.                   

  175.                 // 随机旋转角度  

  176.                 int sAngleInt = random.nextInt(360);  

  177.                 int eAngleInt = random.nextInt(360);  

  178.                   

  179.                 // 随机大小  

  180.                 int wInt = random.nextInt(6);  

  181.                 int hInt = random.nextInt(6);  

  182.                   

  183.                 graphics.fillArc(xInt, yInt, wInt, hInt, sAngleInt, eAngleInt);  

  184.                   

  185.                 // 画5条干扰线  

  186.                 if (i % 20 == 0) {  

  187.                     int xInt2 = random.nextInt(imgWidth);  

  188.                     int yInt2 = random.nextInt(imgHeight);  

  189.                     graphics.drawLine(xInt, yInt, xInt2, yInt2);  

  190.                 }  

  191.             }  

  192.         }  

  193.     }  

  194. }  

由于是个Servlet所以web.xml配置如下:

[html] view plaincopy

  1. <servlet>  

  2.     <servlet-name>validationCode</servlet-name>  

  3.     <servlet-class>com.ninemax.cul.servlet.ValidationCodeServlet</servlet-class>  

  4.   </servlet>  

  5.   

  6.   <servlet-mapping>  

  7.     <servlet-name>validationCode</servlet-name>  

  8.     <url-pattern>/validationCodeServlet.png</url-pattern>  

  9.   </servlet-mapping>  


JSP引用(部分):

[html] view plaincopy

  1. <img id="validationCode" alt="验证码图片" title="验证码图片" src="<%=path %>/validationCodeServlet.png" onclick="refreshCode(this)" />  

  2. <a id="aRecode" href="javascript:void(0);" onclick="refreshCode()">换一张</a>  


JS重新载入图片方法(参考):

[javascript] view plaincopy

  1. /** 

  2.  * 刷新验证码 

  3.  * @param imgObj 验证码Img元素 

  4.  */  

  5. function refreshCode(imgObj) {  

  6.     if (!imgObj) {  

  7.         imgObj = document.getElementById("validationCode");  

  8.     }  

  9.     var index = imgObj.src.indexOf("?");  

  10.     if(index != -1) {  

  11.         var url = imgObj.src.substring(0,index + 1);  

  12.         imgObj.src = url + Math.random();  

  13.     } else {  

  14.         imgObj.src = imgObj.src + "?" + Math.random();  

  15.     }  

  16. }  


本文转载自:http://blog.csdn.net/zhyh1986/article/details/7741244

easonwang
粉丝 4
博文 62
码字总数 5131
作品 0
浦东
程序员
私信 提问
kisso v3.2 发布(里程碑),sso中间件

kisso = cookie sso kisso 里程碑版 V3.2 彻底实现:参数全面可配置化、依赖解耦、核心代码组件化设计、使用更加方便灵活。kisso 基于 Cookie 的 SSO 中间件,它是一把快速开发 java web 登录...

青苗
2015/12/08
3K
21
jfinal 生成验证码在centos6.4中无法显示

jfinal 生成验证码在centos6.4中无法显示。 java版本如下: [root@CYcentos6 ~]# java -version java version "1.7.0_45" Java(TM) SE Runtime Environment (build 1.7.0_45-b18) Java HotS......

枫林茵然
2014/02/17
1K
6
java web验证码生成总结(包括servlet、jsp和struts2实现)(转)

一、使用纯Servlet实现验证码 (1)在web.xml配置: [java] view plaincopy <servlet> <servlet-name>image</servlet-name> <servlet-class>org.test.web.AuthImage</servlet-class> </servlet>......

Famp
2014/07/10
260
0
从.Net到Java学习第十一篇——SpringBoot登录实现

通过前面10篇文章的学习,相信我们对SpringBoot已经有了一些了解,那么如何来验证我们的学习成果呢?当然是通过做项目来证明吧!所以从这一篇开始我将会对之前自己做的.net项目用java来重写。...

邹琼俊
2018/07/13
0
0
Java 验证码识别库 Tess4j 学习

Java 验证码识别库 Tess4j 学习 【在用java的Jsoup做爬虫爬取数据时遇到了验证码识别的问题(基于maven),找了网上挺多的资料,发现Tess4j可以自动识别验证码,在这里简单记录下学习过程及遇...

_TBHacker
2018/08/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JIT编程与方法内联

JIT的比较冷门,首先你要读一下这两篇 帖子: 《面向JIT编程-方法内联》 https://blog.csdn.net/u012834750/article/details/79488572 《浅谈对JIT编译器的理解》 https://www.cnblogs.com/...

爱吃窝窝头
21分钟前
3
0
基于TCP的RPC实现

RPC即远程服务调用 出现原因:随着项目越来越大,访问量越来越大,为了突破性能瓶颈,需要将项目拆分成多个部分,这样比起传统的项目都是本地内存调用,分布式的项目之间需要在网络间进行通信...

少年已不再年少
31分钟前
5
0
OSChina 周二乱弹 —— 他只能用这个办法劝你注意身体了

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @-冰冰棒- :#今日歌曲推荐# Kodaline《High Hopes》 《High Hopes》- Kodaline 手机党少年们想听歌,请使劲儿戳(这里) @xiaoshiyue :仙女...

小小编辑
52分钟前
1K
21
Spring Boot Actuator 整合 Prometheus

简介 Spring Boot 自带监控功能 Actuator,可以帮助实现对程序内部运行情况监控,比如监控状况、Bean加载情况、环境变量、日志信息、线程信息等。这一节结合 Prometheus 、Grafana 来更加直观...

程序员果果
今天
11
0
Linux文件查找命令详解

对于文件查找,我们最好用的还是属于find命令了,在说find命令之前,先把另外几个查找命令介绍一下。 目录 0x01 查询命令介绍 0x02 find命令介绍 0x01 查询命令介绍 在介绍之前,首先先了解一...

无心的梦呓
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部