使用开源工具制作网页验证码的方法


Posted in Javascript onOctober 17, 2016

开发工具:eclipse、kaptcha-2.3.jar包。

一、创建Web项目;

二、新建一个Jsp页面(内容有,一个文本框,一个图片容器,一个提交按钮)

<body> 
<img alt="random" src="randomcode.jpg" onclick="changeR(this)" style="cursor: pointer;"> 
<form action="check.jsp"> 
<input type="text" name="r"> 
<input type="submit" value="s"> 
</form> 
</body>

三、可以看出图片验证码来源(src=“randomcode.jpg”)需配置Web.xml文件。(交给Servlet(该servlet在kaptcha-2.3.jar)处理)

<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>/randomcode.jpg</url-pattern> 
</servlet-mapping>

四、由于需要kaptcha-2.3.jar包,所以将下载好的jar包导入在lib中。(复制黏贴即可)

其他:

一、网页验证码的属性

(一)添加边框

<servlet> 
<init-param> 
<description>图片边框,合法值:yes , no</description> 
<param-name>kaptcha.border</param-name> 
<param-value>yes</param-value> <!-- yes 或者 no--> 
</init-param> 
</servlet>

(二)边框颜色

<init-param> 
<description> 
边框颜色,合法值: r,g,b (and optional alpha) 或者white,black,blue. 
</description> 
<param-name>kaptcha.border.color</param-name> 
<param-value>black</param-value> 
</init-param>

(三)边框厚度

<init-param> 
<description>边框厚度,合法值:>大于0 </description> 
<param-name>kaptcha.border.thickness</param-name> 
<param-value>1</param-value> 
</init-param>

(四)图片宽度

<init-param> 
<description>图片宽 200</description> 
<param-name>kaptcha.image.width</param-name> 
<param-value>200</param-value> 
</init-param>

(五)图片高度

<init-param> 
<description>图片高 50</description> 
<param-name>kaptcha.image.height</param-name> 
<param-value>50</param-value> 
</init-param>

(六)验证码集合

<init-param> 
<description>文本集合,验证码值从此集合中获取</description> 
<param-name>kaptcha.textproducer.char.string</param-name> 
<param-value>1234567890</param-value> <!--纯数字 --> 
//<param-value>abcde2345678gfynmnpwx</param-value> <!-- 文字加英文--> 
</init-param>

(七)验证码长度

<init-param> 
<description>验证码长度 默认是5 </description> 
<param-name>kaptcha.textproducer.char.length</param-name> 
<param-value>2</param-value> 
</init-param>

(八)字体

<init-param> 
<description>字体 Arial, Courier</description> 
<param-name>kaptcha.textproducer.font.names</param-name> 
<param-value>Arial, Courier</param-value> 
</init-param>

(九)字体大小

<init-param> 
<description>字体大小 40px.</description> 
<param-name>kaptcha.textproducer.font.size</param-name> 
<param-value>40</param-value> 
</init-param>

(十)字体颜色

<init-param> 
<description> 
字体颜色,合法值: r,g,b 或者 white,black,blue. 
</description> 
<param-name>kaptcha.textproducer.font.color</param-name> 
<param-value>black</param-value> 
</init-param>

(十一)每个验证码之间的间隔

<init-param> 
<description>文字间隔 2</description> 
<param-name>kaptcha.textproducer.char.space</param-name> 
<param-value>2</param-value> 
</init-param>

(十二)干扰实现

<init-param> 
<description>干扰实现类</description> 
<param-name>kaptcha.noise.impl</param-name> 
<param-value> 
<!-- com.google.code.kaptcha.impl.NoNoise --> 
com.google.code.kaptcha.impl.DefaultNoise 
</param-value> 
</init-param>

(十三)干扰颜色

<init-param> 
<description> 
干扰颜色,合法值: r,g,b 或者 white,black,blue. 
</description> 
<param-name>kaptcha.noise.color</param-name> 
<param-value>black</param-value> 
</init-param>

(十四)背景样式

<init-param> 
<description> 
图片样式: 水纹com.google.code.kaptcha.impl.WaterRipple 
鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 
阴影com.google.code.kaptcha.impl.ShadowGimpy 
</description> 
<param-name>kaptcha.obscurificator.impl</param-name> 
<param-value> 
com.google.code.kaptcha.impl.WaterRipple 
</param-value> 
</init-param>

(十五)背景实现类

<init-param> 
<description>背景实现类</description> 
<param-name>kaptcha.background.impl</param-name> 
<param-value> 
com.google.code.kaptcha.impl.DefaultBackground 
</param-value> 
</init-param>

(十六)背景渐变颜色

<init-param> 
<description>背景颜色渐变,开始颜色</description> 
<param-name>kaptcha.background.clear.from</param-name> 
<param-value>green</param-value> 
</init-param> 
<init-param> 
<description>背景颜色渐变,结束颜色</description> 
<param-name>kaptcha.background.clear.to</param-name> 
<param-value>white</param-value> 
</init-param>

(十七)文字渲染器

<init-param> 
<description> 文字渲染器 </description> 
<param-name>kaptcha.word.impl</param-name> 
<param-value> 
com.google.code.kaptcha.text.impl.DefaultWordRenderer
</param-value> 
</init-param>

(十八)图片的验证码会保存在Session中,其中的值为

<init-param> 
<description> session中存放验证码的key键 </description> 
<param-name>kaptcha.session.key</param-name> 
<param-value>KAPTCHA_SESSION_KEY</param-value> 
</init-param>

(十九)图片实现类别

<init-param> 
<description>图片实现类</description> 
<param-name>kaptcha.producer.impl</param-name> 
<param-value> 
com.google.code.kaptcha.impl.DefaultKaptcha 
</param-value> 
</init-param>

(二十)文本实现类(可通过重写该类来实现验证码为中文)

<init-param> 
<description>文本实现类</description> 
<param-name>kaptcha.textproducer.impl</param-name> 
<param-value> 
com.google.code.kaptcha.text.impl.DefaultTextCreator 
</param-value> 
</init-param>

重写文本实现类,实现验证码为中文:

1.创建一个类别,继承Configurable 实现TextProducer(在jar包中)

import com.google.code.kaptcha.text.TextProducer; 
import com.google.code.kaptcha.util.Configurable; 
import java.util.Random; 
public class ChineseText extends Configurable implements TextProducer { 
public String getText() { 
int length = getConfig().getTextProducerCharLength(); 
String finalWord = "", firstWord = ""; 
int tempInt = 0; 
String[] array = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", 
"a", "b", "c", "d", "e", "f" }; 
Random rand = new Random(); 
for (int i = 0; i < length; i++) { 
switch (rand.nextInt(array.length)) { 
case 1: 
tempInt = rand.nextInt(26) + 65; 
firstWord = String.valueOf((char) tempInt); 
break; 
case 2: 
int r1, 
r2, 
r3, 
r4; 
String strH, 
strL;// high&low 
r1 = rand.nextInt(3) + 11; // 前闭后开[11,14) 
if (r1 == 13) { 
r2 = rand.nextInt(7); 
} else { 
r2 = rand.nextInt(16); 
} 
r3 = rand.nextInt(6) + 10; 
if (r3 == 10) { 
r4 = rand.nextInt(15) + 1; 
} else if (r3 == 15) { 
r4 = rand.nextInt(15); 
} else { 
r4 = rand.nextInt(16); 
} 
strH = array[r1] + array[r2]; 
strL = array[r3] + array[r4]; 
byte[] bytes = new byte[2]; 
bytes[0] = (byte) (Integer.parseInt(strH, 16)); 
bytes[1] = (byte) (Integer.parseInt(strL, 16)); 
firstWord = new String(bytes); 
break; 
default: 
tempInt = rand.nextInt(10) + 48; 
firstWord = String.valueOf((char) tempInt); 
break; 
} 
finalWord += firstWord; 
} 
return finalWord; 
} 
}

2.修改Web.xml配置

<init-param> 
<description>文本实现类</description> 
<param-name>kaptcha.textproducer.impl</param-name> 
<param-value> 
ChineseText 
</param-value> 
</init-param> 
五、验证码的校验(本文是利用check.jsp来校验的)保存在Session中,其中的键值为(第十八个属性)
[html] view plain copy
<body> 
<% 
// 检查是否是正确的验证码 
String k = (String) session.getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY); 
String str = request.getParameter("r"); 
if (k.equals(str)) 
out.print("true"); 
out.print(k + "---" + str); 
%> 
</body>

六、扩展(加法验证码的实现)

1.重写KaptchaServlet类

import com.google.code.kaptcha.Producer; 
import com.google.code.kaptcha.util.Config; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.util.Enumeration; 
import java.util.Properties; 
import javax.imageio.ImageIO; 
import javax.servlet.Servlet; 
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 javax.servlet.http.HttpSession; 
public class KaptchaServlet extends HttpServlet implements Servlet { 
private Properties props; 
private Producer kaptchaProducer; 
private String sessionKeyValue; 
public KaptchaServlet() { 
this.props = new Properties(); 
this.kaptchaProducer = null; 
this.sessionKeyValue = null; 
} 
public void init(ServletConfig conf) throws ServletException { 
super.init(conf); 
ImageIO.setUseCache(false); 
Enumeration initParams = conf.getInitParameterNames(); 
while (initParams.hasMoreElements()) { 
String key = (String) initParams.nextElement(); 
String value = conf.getInitParameter(key); 
this.props.put(key, value); 
} 
Config config = new Config(this.props); 
this.kaptchaProducer = config.getProducerImpl(); 
this.sessionKeyValue = config.getSessionKey(); 
} 
public void doGet(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException { 
resp.setDateHeader("Expires", 0L); 
resp.setHeader("Cache-Control", "no-store, no-cache, must-revalidate"); 
resp.addHeader("Cache-Control", "post-check=0, pre-check=0"); 
resp.setHeader("Pragma", "no-cache"); 
resp.setContentType("image/jpeg"); 
String capText = this.kaptchaProducer.createText(); 
String s1 = capText.substring(0, 1); 
String s2 = capText.substring(1, 2); 
int r = Integer.valueOf(s1).intValue() + Integer.valueOf(s2).intValue(); 
req.getSession().setAttribute(this.sessionKeyValue, String.valueOf(r)); 
BufferedImage bi = this.kaptchaProducer.createImage(s1+"+"+s2+"=?"); 
ServletOutputStream out = resp.getOutputStream(); 
ImageIO.write(bi, "jpg", out); 
try { 
out.flush(); 
} finally { 
out.close(); 
} 
} 
}

2.修改配置文件

<servlet> 
<servlet-name>Kaptcha</servlet-name> 
<servlet-class>KaptchaServlet</servlet-class> 
</servlet>

以上所述是小编给大家介绍的使用开源工具制作网页验证码的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JScript的条件编译
May 29 Javascript
jQuery实现点击标题输入详细信息
Apr 16 Javascript
JS获得图片alt信息的方法
Apr 01 Javascript
jquery实现模拟百分比进度条渐变效果代码
Oct 29 Javascript
浅析js中substring和substr的方法
Nov 09 Javascript
js判断手机号是否正确并返回的实现代码
Jan 17 Javascript
原生js实现省市区三级联动代码分享
Feb 12 Javascript
简述JS控制台的使用
Jul 15 Javascript
react native 仿微信聊天室实例代码
Sep 17 Javascript
微信小程序自定义tabbar custom-tab-bar 6s出不来解决方案(cover-view不兼容)
Nov 01 Javascript
javascript json对象小技巧之键名作为变量用法分析
Nov 11 Javascript
vue如何在用户要关闭当前网页时弹出提示的实现
May 31 Javascript
jQuery 实现ajax传入参数含有特殊字符的方法总结
Oct 17 #Javascript
JavaScript中的ajax功能的概念和示例详解
Oct 17 #Javascript
JQuery中解决重复动画的方法
Oct 17 #Javascript
bootstrap读书笔记之CSS组件(上)
Oct 17 #Javascript
原生JavaScript制作计算器
Oct 16 #Javascript
JavaScript 实现的checkbox经典实例分享
Oct 16 #Javascript
JavaScript正则表达式实例详解
Oct 16 #Javascript
You might like
PHP下编码转换函数mb_convert_encoding与iconv的使用说明
2009/12/16 PHP
在IIS7.0下面配置PHP 5.3.2运行环境的方法
2010/04/13 PHP
php实现单链表的实例代码
2013/03/22 PHP
php pdo oracle中文乱码的快速解决方法
2016/05/16 PHP
一个简单的jQuery插件制作 学习过程及实例
2010/04/25 Javascript
jQuery读取和设定KindEditor值的方法
2013/11/22 Javascript
javascript实现简单的Map示例介绍
2013/12/23 Javascript
js实现点击文本框显示日期选择器特效代码分享
2020/05/21 Javascript
基于JavaScript实现生成名片、链接等二维码
2015/09/20 Javascript
JavaScript截取、切割字符串的技巧
2016/01/07 Javascript
JavaScript tab选项卡插件实例代码
2016/02/23 Javascript
JavaScript 中对象的深拷贝
2016/12/04 Javascript
JavaScript实现的浏览器下载文件的方法
2017/08/09 Javascript
Angular开发实践之服务端渲染
2018/03/29 Javascript
Angular父组件调用子组件的方法
2018/04/02 Javascript
JS实现匀速与减速缓慢运动的动画效果封装示例
2018/08/27 Javascript
nodejs一个简单的文件服务器的创建方法
2019/09/13 NodeJs
微信小程序使用echarts获取数据并生成折线图
2019/10/16 Javascript
js this 绑定机制深入详解
2020/04/30 Javascript
如何用JS模拟实现数组的map方法
2020/07/30 Javascript
Windows下搭建python开发环境详细步骤
2020/07/20 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
2018/12/11 Python
Python操作redis实例小结【String、Hash、List、Set等】
2019/05/16 Python
python3实现斐波那契数列(4种方法)
2019/07/15 Python
18个Python脚本可加速你的编码速度(提示和技巧)
2019/10/17 Python
Django xadmin开启搜索功能的实现
2019/11/15 Python
Python新手如何进行闭包时绑定变量操作
2020/05/29 Python
pandas实现导出数据的四种方式
2020/12/13 Python
中国宠物用品商城:E宠商城
2016/08/27 全球购物
物业工作计划书
2014/01/10 职场文书
化学工程专业求职信
2014/08/10 职场文书
2014年技术员工作总结
2014/11/18 职场文书
服装店员工管理制度
2015/08/07 职场文书
职工培训工作总结
2015/08/10 职场文书
公司客户答谢酒会祝酒词
2015/08/11 职场文书
使用CSS3实现按钮悬停闪烁动态特效代码
2021/08/30 HTML / CSS