- 浏览: 205573 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
harim:
思路十分不错,最近两家公司面试都问到了这个问题,我没有答出来, ...
缓存策略之LRU实现(基于双链表实现) -
javatozhang:
楼主真是良苦用心,很可惜我现在才对Tomcat感兴趣并有时间来 ...
tomcat init中加载哪些类? -
javatozhang:
diecui1202 写道可以看看goldendoc.org小 ...
tomcat init思维图 -
cherishLC:
非常感谢~表示自己没用过jquery,如果 jquery地址改 ...
最简单的jQuery折叠菜单 -
zhypengjw2012:
非常感谢!我今天就用到了!
jQuery插件--滑动条
最近由于Springside3的发布,也来凑热闹学习学习, 毕竟是国人的开源项目。 由于之前仅仅有听过,但是没有具体研究,所以算比较落后的。 不过这个项目确实是非常好的项目, 从中可以了解不少新新东西( - 可能是我太过时了!)
正好我最近需要给老婆开发个小东西,其中有用到验证码的生成, 在Springside里面找到个非常棒的组件---Jcaptcha
Springside对其做了封装,而且其官方的文档看起来也比较费力。所以自己琢磨了半天,才学会一个小的demo。
这里发上来, 希望能帮助有需要的人, (本人在网上找了不少资料, 所给的素材不是不全就是说的不太明白)
OK,开始,我先从一个示例开始。
首先来看看示例的目录结构:
在Jcaptcha的官方文档中有一个 5分钟快速入门的文章, 是介绍快速开发的文章。 有兴趣的可以去上面看看。
这里我发上我的源代码:
web.xml中:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <servlet> <servlet-name>jcaptcha</servlet-name> <servlet-class>com.ivan.zhang.servlet.ImageCaptchaServlet</servlet-class> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>jcaptcha</servlet-name> <url-pattern>/jcaptcha</url-pattern> </servlet-mapping> </web-app>
再需要一个服务类,用来产生Image Service类:
package com.ivan.zhang.servlet; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import javax.imageio.ImageIO; import javax.servlet.ServletConfig; 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.ivan.zhang.CaptchaServiceSingleton; import com.octo.captcha.service.CaptchaServiceException; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageEncoder; public class ImageCaptchaServlet extends HttpServlet { /** * */ private static final long serialVersionUID = 1L; public void init(ServletConfig servletConfig) throws ServletException { super.init(servletConfig); } protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException { byte[] captchaChallengeAsJpeg = null; // the output stream to render the captcha image as jpeg into ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream(); try { // get the session id that will identify the generated captcha. // the same id must be used to validate the response, the session id // is a good candidate! String captchaId = httpServletRequest.getSession().getId(); // call the ImageCaptchaService getChallenge method BufferedImage challenge = CaptchaServiceSingleton.getInstance() .getImageChallengeForID(captchaId, httpServletRequest.getLocale()); // a jpeg encoder JPEGImageEncoder jpegEncoder = JPEGCodec .createJPEGEncoder(jpegOutputStream); jpegEncoder.encode(challenge); } catch (IllegalArgumentException e) { httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND); return; } catch (CaptchaServiceException e) { httpServletResponse .sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); return; } captchaChallengeAsJpeg = jpegOutputStream.toByteArray(); // flush it in the response httpServletResponse.setHeader("Cache-Control", "no-store"); httpServletResponse.setHeader("Pragma", "no-cache"); httpServletResponse.setDateHeader("Expires", 0); httpServletResponse.setContentType("image/jpeg"); ServletOutputStream responseOutputStream = httpServletResponse .getOutputStream(); responseOutputStream.write(captchaChallengeAsJpeg); responseOutputStream.flush(); responseOutputStream.close(); } }
OK,后台的类写完了, 现在我们来看看前台页面的编写:
index.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form action="sample.jsp"> <img src="jcaptcha"> <input type='text' name='j_captcha_response' value=''> </form> </body> </html>
sample.jsp: (用来验证的页面 )
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="UTF-8"%> <%@page import="com.octo.captcha.service.CaptchaServiceException"%> <%@page import="com.ivan.zhang.CaptchaServiceSingleton"%> <% Boolean isResponseCorrect = Boolean.FALSE; //remenber that we need an id to validate! String captchaId = request.getSession().getId(); //retrieve the response String responsestr = request.getParameter("j_captcha_response"); // Call the Service method try { isResponseCorrect = CaptchaServiceSingleton.getInstance().validateResponseForID(captchaId, responsestr); if(isResponseCorrect){ }else{ out.print("It's worng......"); } } catch (CaptchaServiceException e) { //should not happen, may be thrown if the id is not valid } %>
这样,我们的第一个版本出来了, 我们来看看效果:
我们看到, 虽然生成了验证码,但是这样的图片给人非常不友好的感觉, 所以我参考Springside中的一样,自己给他设定产生图片的样式:
要实现自定义样式,我们需要一下2个步骤:
1. 告诉Jcaptcha 我要的样式是什么样子.
2. 在提交后,利用我们自己的样式来产生图片.
所以,我们改动一下 :
新加一个类GmailEngine.java(直接拿至Springside ,非常感谢白衣的共享,让我们这样的菜鸟学到很多东西.)
其中代码如下:
package com.ivan.zhang.servlet; import java.awt.Color; import java.awt.Font; import java.awt.image.ImageFilter; import com.octo.captcha.component.image.backgroundgenerator.BackgroundGenerator; import com.octo.captcha.component.image.backgroundgenerator.UniColorBackgroundGenerator; import com.octo.captcha.component.image.color.RandomListColorGenerator; import com.octo.captcha.component.image.deformation.ImageDeformation; import com.octo.captcha.component.image.deformation.ImageDeformationByFilters; import com.octo.captcha.component.image.fontgenerator.FontGenerator; import com.octo.captcha.component.image.fontgenerator.RandomFontGenerator; import com.octo.captcha.component.image.textpaster.DecoratedRandomTextPaster; import com.octo.captcha.component.image.textpaster.TextPaster; import com.octo.captcha.component.image.textpaster.textdecorator.TextDecorator; import com.octo.captcha.component.image.wordtoimage.DeformedComposedWordToImage; import com.octo.captcha.component.image.wordtoimage.WordToImage; import com.octo.captcha.component.word.FileDictionary; import com.octo.captcha.component.word.wordgenerator.ComposeDictionaryWordGenerator; import com.octo.captcha.component.word.wordgenerator.WordGenerator; import com.octo.captcha.engine.image.ListImageCaptchaEngine; import com.octo.captcha.image.gimpy.GimpyFactory; /** * 仿照JCaptcha2.0编写GMail验证码样式的图片引擎. * * @author calvin */ public class GMailEngine extends ListImageCaptchaEngine { @Override protected void buildInitialFactories() { int minWordLength = 4; int maxWordLength = 5; int fontSize = 50; int imageWidth = 250; int imageHeight = 100; //word generator WordGenerator dictionnaryWords = new ComposeDictionaryWordGenerator(new FileDictionary("toddlist")); //word2image components TextPaster randomPaster = new DecoratedRandomTextPaster(minWordLength, maxWordLength, new RandomListColorGenerator(new Color[] { new Color(23, 170, 27), new Color(220, 34, 11), new Color(23, 67, 172) }), new TextDecorator[] {}); BackgroundGenerator background = new UniColorBackgroundGenerator(imageWidth, imageHeight, Color.white); FontGenerator font = new RandomFontGenerator(fontSize, fontSize, new Font[] { new Font("nyala", Font.BOLD, fontSize), new Font("Bell MT", Font.PLAIN, fontSize), new Font("Credit valley", Font.BOLD, fontSize) }); ImageDeformation postDef = new ImageDeformationByFilters(new ImageFilter[] {}); ImageDeformation backDef = new ImageDeformationByFilters(new ImageFilter[] {}); ImageDeformation textDef = new ImageDeformationByFilters(new ImageFilter[] {}); WordToImage word2image = new DeformedComposedWordToImage(font, background, randomPaster, backDef, textDef, postDef); addFactory(new GimpyFactory(dictionnaryWords, word2image)); } }
如果有玩过Swing的兄弟,应该会很好理解上面的代码。
继续,我们有了自己的样式类, 接下来我们就要告诉servlet我们需要用哪个样式生成图片。
就有如下,将CaptchaServiceSingleton类修改一下:
package com.ivan.zhang; import com.ivan.zhang.servlet.GMailEngine; import com.octo.captcha.engine.GenericCaptchaEngine; import com.octo.captcha.service.CaptchaService; import com.octo.captcha.service.captchastore.FastHashMapCaptchaStore; import com.octo.captcha.service.image.DefaultManageableImageCaptchaService; import com.octo.captcha.service.image.ImageCaptchaService; /** * 按照官方的做法: 一定为单例 * @author Administrator * */ public class CaptchaServiceSingleton { private static ImageCaptchaService instance = new DefaultManageableImageCaptchaService( new FastHashMapCaptchaStore(), new GMailEngine(), 180, 100000 , 75000); public static ImageCaptchaService getInstance(){ return instance; } }
同样的,修改一下Servlet类:
改动如下:
package com.ivan.zhang.servlet; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import javax.imageio.ImageIO; import javax.servlet.ServletConfig; 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.ivan.zhang.CaptchaServiceSingleton; import com.octo.captcha.service.CaptchaServiceException; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageEncoder; public class ImageCaptchaServlet extends HttpServlet { /** * */ private static final long serialVersionUID = 1L; public void init(ServletConfig servletConfig) throws ServletException { super.init(servletConfig); } protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException { genernateCaptchaImage(httpServletRequest, httpServletResponse); } /** * 生成验证码图片. */ private void genernateCaptchaImage(final HttpServletRequest request, final HttpServletResponse response) throws IOException { response.setHeader("Cache-Control", "no-store"); response.setHeader("Pragma", "no-cache"); response.setDateHeader("Expires", 0); response.setContentType("image/jpeg"); ServletOutputStream out = response.getOutputStream(); try { String captchaId = request.getSession(true).getId(); BufferedImage challenge = (BufferedImage) CaptchaServiceSingleton.getInstance().getChallengeForID(captchaId, request.getLocale()); ImageIO.write(challenge, "jpg", out); out.flush(); } catch (CaptchaServiceException e) { } finally { out.close(); } } }
OK, 这样我们产生的图片样式就会好看多了。 不相信? OK, 非要上图才有人相信。
截图如下:
再来一下刷新:
OK, 先写到这,希望对有需要的人有帮助。
如果有人懒得敲代码,我这里附上我的工程源代码, 不过我还是觉得,咱弄技术的人, 就得把键盘当筷子, 你见过非常饿,但不想拿筷子的人吗?(别说老外用叉子……)
- jcaptcha-sample.rar (834.4 KB)
- 下载次数: 2986
评论
其实完全可以有很多其他的思路,比如随机给出一张人脸,回答是哪种表情。
总之,只要AI做不到的事情就可以了,不要太多。
我一直就搞不懂 驗證碼 有啥用呢?
能不能說具體一點呢? 為什麽多一個這個東西,沒感到它有什麽作用 就是多一次輸入而已呀?
地址http://code.google.com/p/basicaidedcomponent/
如果接受这种简单效果的验证码,不如自己简单写个类,实现也很简单。
不过验证码确属防君子不防小人,有研究表明现在的图像识别软件其实和人眼基本是一样厉害,像yahoo那种复杂的验证码基本上人眼和软件的识别率都是30%多。
发表评论
-
博客停止更新
2012-04-24 11:37 1179该博客停止更新,请移步:ivanzhangwb.com -
JProfile初步使用图解
2011-11-02 13:28 5935最近参与平台的短信平台项目,在项目的后期,参与了一些性能 ... -
J2EE简单性的红利
2011-01-02 00:26 1416复杂性的代价: 系统架构上的复杂性,如果并非出于必要 ... -
读《Unix编程艺术》 第四章:模块化、保持清晰、保持简洁
2010-12-26 18:17 1623第四章: 模块化、保持 ... -
阿里巴巴电面整理(二)
2010-07-02 04:03 3987还是接着昨天的帖子来吧, 题目都在上一篇《阿里巴巴电面整理 ... -
阿里巴巴电面整理
2010-07-01 01:47 4941今天中午接到阿里巴巴的电话面试,电面了将近一 ... -
我的Google 在线文档地址
2010-06-26 02:18 1223本人整理的一些文档, 关于技术,工作,生活的。 会陆续发 ... -
读 IBM中国 《Java 理论和实践: 了解泛型》
2010-06-26 02:09 1312了解Java泛型 参考于IBM Develop ... -
世界杯期间离职……
2010-06-17 01:13 1385来深圳时间不长,但是很错误的进入一个外包公司待到现在, ... -
MD5验证文件
2010-01-22 01:31 1119参考多篇网上的资料。 记录一下 java用MD5验证文件的 ... -
web服务器工作方式
2010-01-09 14:16 1798记录一下 web服务器 ... -
开源UML项目Udoc简介
2010-01-04 19:47 3047由于对开源的热爱,经常需要看开源的东东,但是像Strut ... -
非常不错的Struts2教程
2010-01-02 21:25 1210非常不错的Struts2教程,原创是downpour ... -
VC++之 Windows进程篇
2009-12-23 01:01 2296保护模式: 基于 X86 微处理器 ... -
eclipse 配置C/C++开发环境
2009-12-22 00:21 7435关于正常配置,请参考:http://jimychen ... -
RBAC权限涉猎之关系处理
2009-12-19 01:45 1582最近需要关注到RBAC这部分的理论知识。 ... -
重装XP以后修复Ubuntu引导
2009-12-03 23:37 2399在重装XP系统之后,引导区被windows强制的重写了一遍,导 ... -
Ant创建项目模版Demo
2009-11-14 21:01 3247由于项目中有用到公司自己封装的SDK,那么如果有新的开发 ... -
Ant+Freemarker+xml 生成Html
2009-11-12 22:12 2948最近客户项目中有用到freemarker生成原始的项目模版 ... -
HSQLDB的简单使用
2009-10-22 14:31 1607本文只简单讲述hsqldb的使用方法, 具体Hsql是什 ...
相关推荐
这个“效果超棒的Webgl模型-手袋”很可能是一个包含高质量3D模型的手袋展示项目,利用WebGL技术在网页上实现交互式、动态的3D视图。 WebGL的核心是它允许开发者直接在浏览器中处理顶点、颜色、纹理和光照等图形数据...
"效果超棒的Webgl模型-实木餐桌"标题表明我们讨论的是一个使用WebGL技术创建的实木餐桌的3D模型,它在网页上展示的效果非常出色。 在描述中虽然没有提供具体细节,但我们可以推测这个模型具有高度的逼真度,可能...
这个“效果超棒的Webgl模型-孙悟空”显然是一款利用WebGL技术制作的、以中国古典名著《西游记》中的主角孙悟空为主题的三维模型。通过WebGL,开发者可以将复杂的3D模型和动画带到网页上,提供丰富的交互体验。 首先...
"效果超棒的Webgl模型-老式茶壶"这个项目,显然是一个展示高质量3D模型的实例,它利用WebGL技术将一个老式茶壶的三维模型呈现于网页之中。 首先,让我们深入了解WebGL的工作原理。WebGL基于OpenGL ES 2.0,这是一种...
"效果超棒的Webgl模型-老式照片机2"是一个利用WebGL技术制作的高质量3D模型,它呈现了一台复古的老式照片机,为网页添加了深度和真实感。 WebGL的基础是OpenGL ES 2.0,这是一种用于嵌入式设备的图形库,如智能手机...
"效果超棒的WebGL模型-两层小别墅2"意味着我们正在讨论一个高质量的3D模型,它是一个两层小别墅的再现,通过WebGL技术在网页上展示。 首先,我们需要理解WebGL的基础。WebGL基于OpenGL ES 2.0,这是一项用于嵌入式...
在这个名为“效果超棒的Webgl模型-两层公寓”的资源中,我们可能找到了一个精心设计的3D公寓模型,它利用WebGL技术在网页上展示了一个逼真的二层住宅空间。 WebGL的工作原理是通过JavaScript与GPU进行通信,绘制...
这个名为“效果超棒的Webgl模型-人体肺”的资源,显然是一个利用WebGL技术创建的、展示人体肺部结构的三维模型。在网页中,用户可以通过鼠标或触摸操作来旋转、缩放和平移模型,从而从不同角度观察肺部的细节。 ...
这个"效果超棒的Webgl模型-人体心脏跳动"项目,显然展示了一个交互式的、逼真的心脏跳动模拟,这涉及到多个IT领域的知识点。 首先,WebGL的基础是图形学。它使用顶点、纹理、着色器等元素来构建和渲染三维模型。在...
这个名为“效果超棒的Webgl模型-老式汽车”的压缩包文件,显然包含了一个高质量的3D老式汽车模型,非常适合用于网页设计、游戏开发或者在线展示等场景。 首先,WebGL允许开发者直接在浏览器环境中创建复杂的3D场景...
这个“效果超棒的Webgl模型-巴士”显然是一款使用WebGL技术创建的3D模型,它允许用户在网页上体验逼真的巴士模型。在网页设计和开发中,这种技术的应用极大地提升了用户体验,使得网站内容更加生动、直观。 首先,...
在这个“效果超棒的Webgl模型-帆船”中,我们可以探讨WebGL在3D建模、渲染和交互性方面的应用。 首先,3D建模是创建三维物体的过程,包括帆船这样的复杂对象。这涉及到几何形状的构建、纹理的添加以及光照和阴影的...
这个“效果超棒的Webgl模型-机甲战士”显然是一款使用WebGL技术创建的交互式3D模型,展示了机甲战士的形象。这种技术允许用户在网页上直接体验高质量的3D视觉效果,提供了丰富的互动性和沉浸感。 首先,我们要理解...
这个“效果超棒的Webgl模型-现代货船”压缩包很可能是包含了一艘现代货船的3D模型,设计者或开发者可以将其集成到网页中,展示逼真的海洋运输场景或进行互动式体验。 WebGL的核心在于它能够将复杂的3D几何数据、...
这个“效果超棒的Webgl模型-一堆石头”很可能包含了一组精心设计的3D模型,这些模型可能用于创建虚拟现实场景、游戏或者网页中的装饰元素。现在,让我们深入探讨WebGL和3D建模的相关知识点。 首先,WebGL是Web图形...
"效果超棒的Webgl模型-驱逐舰"显然是一款利用WebGL技术创建的3D驱逐舰模型,它可能被应用于教育、游戏或者军事展示等领域,让用户在网页上就能欣赏到逼真的海上战舰。 WebGL的核心在于它可以访问硬件图形加速功能,...
"效果超棒的Webgl模型-尤达大师"这个主题,显然涉及到的是利用WebGL技术创建的高质量3D模型,尤达大师是源自《星球大战》中的虚构角色,具有很高的辨识度,因此这个模型可能是粉丝或专业设计师为了展示WebGL技术潜力...
这个“效果超棒的Webgl模型-人体心脏”是一个利用WebGL技术展示人体心脏结构的互动应用。它能够让用户在网页上直观地观察、旋转和交互操作心脏模型,提供了一种生动的学习和研究人体解剖的方式。 首先,我们要理解...
为了实现"效果超棒",开发者可能还运用了高级的技术,比如PBR(物理渲染)来模拟真实世界中的光照和反射,或者使用LOD(细节层次)技术来优化性能,根据模型距离摄像机的远近动态调整细节级别。此外,实时阴影、环境...
这个“效果超棒的Webgl模型-老式战斗机”显然是一款使用WebGL技术实现的交互式3D模型,展示了老旧战斗机的精细细节和动态效果。 在WebGL中,模型通常由一系列几何形状(如点、线和多边形)组成,并通过纹理、光照和...