为了防止程序破解系统登录,一般都会采用登录+验证码的措施。
kaptcha是我用到的最好用的一个验证码工具,使用非常的简单。
瞧瞧我在项目中使用的效果吧!感觉还是很不错的。
使用方法:
1.当然是下载kaptcha的jar包了
kaptaca的地址:http://code.google.com/p/kaptcha/
我在下面也提供一个我修改的版本,修改点下面说。
2.在web.xml中增加配置
1:<servlet>
2:<servlet-name>Kaptcha</servlet-name>
3:<servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
4:</servlet>
5:<servlet-mapping>
6:<servlet-name>Kaptcha</servlet-name>
7:<url-pattern>/kaptcha.jpg</url-pattern>
8:</servlet-mapping>
3.在需要的页面进行调用
1:<imgsrc="Kaptcha.jpg">
2:<formmethod="POST">
3:<br>验证码:<inputtype="text"name="kaptchafield"><br/>
4:<inputtype="submit"name="submit">
5:</form>
4.验证
1: String key = (String)session.getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);
2: String parm = (String) request.getParameter("kaptchafield");
3:
4: out.println("验证码的值: " + key+"<br />");
5: out.println("您输入的值: " + parm);
6:
7:if (key != null && parm != null) {
8:if (key.equals(parm)) {
9: out.println("<b>验证成功</b>");
10: } else {
11: out.println("<b>验证失败</b>");
12: }
13: }
看看效果来
效果还不错的,就是美化不怎么好,好在kaptcha的自定义功能很强,可以根据需要自定义自己的效果。
kaptcha的配置属性
**Constant****Description****Default** kaptcha.border 是否有边框 默认为yes 我们可以自己设置yes,no yes kaptcha.border.color 边框颜色 默认为Color.BLACK black kaptcha.border.thickness 边框粗细度 默认为1 1 kaptcha.image.width 验证码图片宽度 默认为200 200 kaptcha.image.height 验证码图片高度 默认为50 50 kaptcha.producer.impl 验证码生成器 com.google.code.kaptcha.impl.DefaultKaptcha kaptcha.textproducer.impl 验证码文本生成器 com.google.code.kaptcha.text.impl.DefaultTextCreator kaptcha.textproducer.char.string 验证码文本字符内容范围 abcde2345678gfynmnpwx kaptcha.textproducer.char.length 验证码文本字符长度 5 kaptcha.textproducer.char.space 验证码文本字符间距 默认为2 2 kaptcha.textproducer.font.names 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) Arial, Courier kaptcha.textproducer.font.size 验证码文本字符大小 40px. kaptcha.textproducer.font.color 验证码文本字符颜色 默认为Color.BLACK black kaptcha.noise.impl 验证码噪点生成对象 com.google.code.kaptcha.impl.DefaultNoise kaptcha.noise.color 验证码噪点颜色 默认为Color.BLACK black kaptcha.obscurificator.impl 验证码样式引擎 默认为WaterRipple com.google.code.kaptcha.impl.WaterRipple kaptcha.background.impl 验证码背景生成器 默认为DefaultBackground com.google.code.kaptcha.impl.DefaultBackground kaptcha.background.clear.from 验证码背景颜色渐进 默认为Color.LIGHT_GRAY light grey kaptcha.background.clear.to 验证码背景颜色渐进 默认为Color.WHITE white kaptcha.word.impl 验证码文本字符渲染 默认为DefaultWordRenderer com.google.code.kaptcha.text.impl.DefaultWordRenderer kaptcha.session.key 放入session的key名称 KAPTCHA_SESSION_KEY kaptcha.session.date session中key的存活时间 KAPTCHA_SESSION_DATE
kaptcha中验证码样式引擎有WaterRipple(水纹类似的)、ShadowGimpy(投影)、FishEyeGimpy(鱼眼)三种样式,在将图片缩小一些后,有这些样式,就很难辨认了。所以,我就增加了一种没有干扰效果的样式,NoGimpy,代码很简单。
1:package com.google.code.kaptcha.impl;
2:
3:import java.awt.Graphics2D;
4:import java.awt.image.BufferedImage;
5:
6:import com.google.code.kaptcha.GimpyEngine;
7:import com.google.code.kaptcha.util.Configurable;
8:
9:publicclass NoGimpy extends Configurable implements GimpyEngine {
10:
11:public BufferedImage getDistortedImage(BufferedImage baseImage) {
12: BufferedImage distortedImage = new BufferedImage(baseImage.getWidth(),
13: baseImage.getHeight(), BufferedImage.TYPE_INT_ARGB);
14:
15: Graphics2D graph = (Graphics2D) distortedImage.getGraphics();
16: graph.drawImage(baseImage, 0, 0, null, null);
17: graph.dispose();
18:return distortedImage;
19: }
20:
21: }
class文件已经打包到kaptcha-2.3.2.1.jar中了,这个其实可以自定义在自己的项目中的,只不过我是为了方便以后使用,省的每次都复制代码。
kaptcha在spring中也是可以使用的,我采用的是servlet的方式。为了统一整体框架,推荐使用spring的方式,如果是简单好用,那就用servlet吧!
注:如果在spring中是配置web.xml,session中是取不到key值的,因为spring本身就是个单独的applicationcontext,要不就采用servlet的方式,要不就用spring的方式。
spring的方式
1.bean配置,初始化默认水属性
1:<beanid="captchaProducer"class="com.google.code.kaptcha.impl.DefaultKaptcha">
2:<propertyname="config">
3:<beanclass="com.google.code.kaptcha.util.Config">
4:<constructor-arg>
5:<props>
6:<propkey="kaptcha.border">no</prop>
7:<propkey="kaptcha.border.color">105,179,90</prop>
8:<propkey="kaptcha.textproducer.font.color">red</prop>
9:<propkey="kaptcha.image.width">250</prop>
10:<propkey="kaptcha.textproducer.font.size">90</prop>
11:<propkey="kaptcha.image.height">90</prop>
12:<propkey="kaptcha.session.key">code</prop>
13:<propkey="kaptcha.textproducer.char.length">4</prop>
14:<propkey="kaptcha.textproducer.font.names">宋体,楷体,微软雅黑</prop>
15:</props>
16:</constructor-arg>
17:</bean>
18:</property>
19:</bean>
2.后台action
1: @RequestMapping("/captcha-image")
2:public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
3:throws Exception {
4: response.setDateHeader("Expires", 0);
5:// Set standard HTTP/1.1 no-cache headers.
6: response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
7:// Set IE extended HTTP/1.1 no-cache headers (use addHeader).
8: response.addHeader("Cache-Control", "post-check=0, pre-check=0");
9:// Set standard HTTP/1.0 no-cache header.
10: response.setHeader("Pragma", "no-cache");
11:// return a jpeg
12: response.setContentType("image/jpeg");
13:// create the text for the image
14: String capText = captchaProducer.createText();
15:// store the text in the session
16: request.getSession().setAttribute(Constants.KAPTCHA_SESSION_KEY, capText);
17:// create the image with the text
18: BufferedImage bi = captchaProducer.createImage(capText);
19: ServletOutputStream out = response.getOutputStream();
20:// write the data out
21: ImageIO.write(bi, "jpg", out);
22:try {
23: out.flush();
24: } finally {
25: out.close();
26: }
27:return null;
28: }
3.页面调用
1:<inputname="kaptcha"type="text"id="kaptcha"/>
2:<imgsrc="/captcha-image.do"width="55"height="20"id="kaptchaImage"/>
4.验证
1: String code = (String)request.getSession().getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);
下载:kaptcha修改版 | kaptcha演示demo