首先编写生成验证码数字以及图片的类RandomNumUtil.java。具体代码如下:
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;
public class RandomNumUtil {
/*
* ByteArrayInputStream包含一个内部缓冲,存储从流中读取的字节。
*/
private ByteArrayInputStream image;// 图像
private String str;// 验证码
private RandomNumUtil() {
init();// 初始化各属性
}
public ByteArrayInputStream getImage() {
return this.image;
}
public String getString() {
return this.str;
}
private void init() {
// 在内存中创建图象
int width = 86, height = 21;
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// 获取图形上下文
Graphics g = image.getGraphics();
// 生成随机类
Random random = new Random();
// 设定背景色
g.setColor(getRandColor(200, 250));
g.fillRect(0, 0, width, height);
// 设定字体
g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
g.setColor(getRandColor(160, 200));
for (int i = 0; i < 155; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x, y, x + xl, y + yl);
}
// 取随机产生的认证码(6位数字)
String sRand = "";
for (int i = 0; i < 6; i++) {
String rand = String.valueOf(random.nextInt(10));
sRand += rand;
// 将认证码显示到图象中
g.setColor(new Color(20 + random.nextInt(110), 20 + random
.nextInt(110), 20 + random.nextInt(110)));
// 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
g.drawString(rand, 13 * i + 6, 16);
}
// 赋值验证码
this.str = sRand;
// 图象生效
g.dispose();
ByteArrayInputStream input = null;
ByteArrayOutputStream output = new ByteArrayOutputStream();
try {
ImageOutputStream imageOut = ImageIO
.createImageOutputStream(output);
ImageIO.write(image, "JPEG", imageOut);
imageOut.close();
input = new ByteArrayInputStream(output.toByteArray());
} catch (Exception e) {
System.out.println("验证码图片产生出现错误:" + e.toString());
}
this.image = input;/* 赋值图像 */
}
/*
* 给定范围获得随机颜色
*/
private Color getRandColor(int fc, int bc) {
Random random = new Random();
if (fc > 255)
fc = 255;
if (bc > 255)
bc = 255;
int r = fc + random.nextInt(bc - fc);
int g = fc + random.nextInt(bc - fc);
int b = fc + random.nextInt(bc - fc);
return new Color(r, g, b);
}
}
然后,创建具体的控制类RandomAction.java,具体代码如下:
import java.io.ByteArrayInputStream;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.softeye.util.RandomNumUtil;
public class RandomAction extends ActionSupport {
private ByteArrayInputStream inputStream;
public String execute() throws Exception {
RandomNumUtil rdnu = new RandomNumUtil();
this.setInputStream(rdnu.getImage());// 取得带有随机字符串的图片
ActionContext.getContext().getSession().put("random", rdnu.getString());// 取得随机字符串放入HttpSession
return SUCCESS;
}
public void setInputStream(ByteArrayInputStream inputStream) {
this.inputStream = inputStream;
}
public ByteArrayInputStream getInputStream() {
return inputStream;
}
}
再然后,对struts.xml中RandomAction.进行配置,具体代码如下:
<!-- Random验证码 -->
<action name="rand" class="com.softeye.action.login.RandomAction">
<result type="stream">
<param name="contentType">image/jpeg</param>
<param name="inputName">inputStream</param>
</result>
</action>
最后,在注册页面添加验证码功能:
其一:在head标签内添加JavaScript,具体代码如下:
<script type="text/javascript">
function changeValidateCode(obj) {
//获取当前的时间作为参数,无具体意义
var timenow = new Date().getTime();
//每次请求需要一个不同的参数,否则可能会返回同样的验证码
//这和浏览器的缓存机制有关系,也可以把页面设置为不缓存,这样就不用这个参数了。
obj.src="<%=path%>/user/rand.action?d="+timenow;
}
</script>
其二,在页面相应位置设计验证码,例如:
<tr>
<th>
<span>*</span>验证码:
</th>
<td>
<input id="" name="rand" value="" type="text" />
<span><img src="<%=path %>/user/rand.action" onclick="changeValsidateCode(this)" title="点击图片刷新验证码"/>
</span>
</td>
</tr>
至此,一个防止批量注册的验证码功能就实现了。
分享到:
相关推荐
基于深度学习字符型图片数字验证码识别完整过程及Python实现(深度学习学习、实现数字、字符模型训练、详细介绍附源码) 基于深度学习字符型图片数字验证码识别完整过程及Python实现(深度学习学习、实现数字、字符...
开发者可以通过`gocaptcha-master`这个项目来学习和理解如何在beego框架中集成和使用图形验证码库。 总结起来,beego框架的图形验证码实现是通过Go语言的强大功能和灵活性实现的,它提供了高度定制化的选项,使得...
在这个“卷积神经网络验证码识别tensorflow实现”的项目中,我们使用了CNN来解决四位数字和字母组成的验证码识别问题。验证码识别是计算机视觉领域的一个常见任务,它有助于防止自动化机器人和恶意软件对网站的滥用...
在本压缩包中,"易语言点选验证码学习源码" 提供了一个学习点选验证码处理的实例,这在网络安全、自动化测试以及人工智能领域都有广泛的应用。 验证码(CAPTCHA)是一种防止机器自动操作的技术,通常用于验证用户...
python毕业设计基于深度学习卷积神经网络的网站验证码识别研究与实现项目源码+全部数据.zip这是本科毕业设计的课题,“基于深度学习的网站验证码识别研究与实现”。主要是利用卷积神经网络,基于TensorFlow平台,...
字符型图片数字验证码识别完整过程及Python实现(深度学习学习、实现数字、字符模型训练),欢迎大家获取,有什么问题,留言咨询,多多交流。 字符型图片数字验证码识别完整过程及Python实现(深度学习学习、实现...
在这个项目中,我们将探讨如何使用Keras,一个高级神经网络API,构建深度学习模型来解决验证码识别问题。Keras运行在TensorFlow、Theano或CNTK等深度学习后端上,提供了简洁、高效的接口,使得构建和训练复杂的神经...
总的来说,基于MATLAB的数字验证码识别系统设计与实现是一个综合了图像处理、模式识别和机器学习技术的项目,对于提升自动化系统的智能化水平具有重要价值。同时,它也是研究者和工程师锻炼技能、探索新算法的宝贵...
在本项目中,我们通过Servlet来实现验证码的校验功能,这是一个典型的Web开发中的验证流程。Servlet是Java中用于处理HTTP请求的服务端组件,它可以接收用户的请求并返回响应。 首先,我们需要理解验证码的基本原理...
开发者可以通过阅读和理解这些文件,学习如何实现局部刷新的验证码功能。 总的来说,局部刷新验证码的实现不仅提升了用户体验,也简化了开发流程,尤其对于不熟悉Ajax技术的开发者,这是一个很好的实践案例。通过...
通过学习和实践这个简单的PHP验证码项目,开发者可以深入了解PHP的图像处理能力,同时掌握如何使用session进行数据持久化,以及前端与后端的交互。这对于构建更复杂的Web应用是非常基础且重要的技能。
“深度学习下网站验证码的破解与防范” 随着互联网的快速发展,网站验证码的安全性变得越来越重要。随着深度学习技术的不断发展,验证码识别技术也变得越来越成熟。然而,简单的验证码依然存在安全风险,为了防止...
本文将详细介绍如何使用Vue框架来实现滑动验证码功能,为读者提供一个实现前端校验验证码的实例。 首先,我们要了解验证码的基本原理。验证码分为前后端校验两个阶段。前端校验主要防止自动化程序(机器人)进行...
### 验证码识别与Caffe实现 #### 一、验证码识别概述 验证码(CAPTCHA)是一种用于区分用户是人类还是计算机程序的技术手段,广泛应用于网站登录、注册等环节,以防止恶意攻击或自动化操作。随着人工智能技术的...
总结来说,"机器学习 破验证码"是机器学习在图像识别领域的一个具体应用实例,它利用Python和TensorFlow实现了一个高效的验证码识别系统。这不仅展示了机器学习的强大功能,也提醒我们在设计安全机制时要考虑到对抗...
本课题主要商议了基于深度学习的验证码识别方法设计与实现。具体地,第一步采集验证码图像。这些验证码图像来源有两种:一是通过编程仿照常见的验证码图像生成数据集;二是从站上下载验证码图像保存成数据集。第二步...
通过这个小实例,我们可以学习到如何利用Java和HttpSession来创建一个简单的验证码登录系统,同时也了解到验证码在防止自动登录和恶意攻击中的作用。在实际开发中,还可以根据需求进一步优化,例如引入滑动验证、...
验证码控件是网页安全的重要组成部分,它用于防止自动机器人或者恶意脚本进行非法操作,如批量注册、恶意登录等...通过分析这些文件,我们可以学习如何将这些概念和技术应用到实际项目中,构建自己的无刷新验证码系统。
因此,持续改进验证码设计,结合现代的机器学习技术来防止自动识别,是保持其有效性的重要任务。 在编程实现上,开发者可能会使用Python的PIL(Python Imaging Library)或OpenCV库来处理图像,生成扭曲和干扰效果...
这可以通过配置类来实现,开发者可以根据项目需求调整验证码的视觉效果,使其与网站风格保持一致。 1. 字母验证码:这种验证码由大小写字母组成,可以增加破解难度,因为区分大小写增加了机器识别的复杂性。 2. ...