JSP 制作验证码的实例详解
发布时间 - 2026-01-11 02:52:26 点击率:次JSP 制作验证码的实例详解

验证码
验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。
Jsp制作验证码
运行环境:tomcat+eclipse+jdk
基本思想:现在Servlet上画出验证码的图片,让其显示到页面上,再用js方法能刷新验证码,可以用ajax得到用户输入的值经过servlet跟验证码比对判断是否,并符合提示用户
基本方法:
BufferedImage:
Image是一个抽象列,BufferedImage是Image的实现。 Image和BufferedImage的主要作用就是将一副图片加载到内存中。 Java将一副图片加载到内存中的方法是: Java代码 String imgPath = "d:/demo.jpg"; BufferedImage image = ImageIO.read(new FileInputStream(imgPath)); 该方法可以获得图片的详细信息,例如:获得图片的宽度:image.getWidth(null);图片只有加载内存中才能对图片进行进一步的处理。
Graphics:
Graphics类提供基本的几何图形绘制方法,主要有:画线段、画矩形、画圆、画带颜色的图形、画椭圆、画圆弧、画多边形等,具体操作其内容我推荐可以看看使用Java的Graphics类进行绘图的方法详解
验证码的代码实现
我这里做的验证码是显示中文的,可以在servlet中修改想要显示的是数字还是字母还是结合的,可以用数组存放这些,也可以转换ASCII码经行随机数字,看个人喜好
先是做一个jsp中的验证码的地方
<div class="row cl">
<div>
<input type="text" placeholder="验证码" value="验证码:" onblur="testCheck(this.value);">
<img id="pic" src="CheckTestServlet"> <a id="kanbuq" onClick="Checktest();">看不清,换一张</a> </div>
</div>
在做一个Servlet叫做CheckTestServlet.java
@WebServlet("/CheckTestServlet")
public class CheckTestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//这个方法实现验证码的生成
response.setCharacterEncoding("utf-8");
//创建图片缓冲区设置其大小 BufferedImage(int width, int height, int imageType)
BufferedImage bImage=new BufferedImage(100, 30, BufferedImage.TYPE_3BYTE_BGR);
//在缓冲区上创建画布
Graphics g=bImage.getGraphics();
//设置背景颜色
g.setColor(Color.orange);
//创建画布矩形,位置(0,0)点,大小100,30
g.fillRect(0, 0, 100, 30);
//创建随机对象
Random r=new Random();
int index;//存放随机数
//得到的文字东西存放处
StringBuffer sBuffer=new StringBuffer();
//循环产生四个字
for (int i = 0; i < 4; i++) {
//中文字的第一个十六进制码为4e00转十进制是19968,最后一个是9fa0十进制为40869,所以可以产生在此之间的随机数
index=r.nextInt(40869-19968+1)+19968;//产生随机数字
//设置随机颜色,
g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255)));
//设置文字的类型,大小
g.setFont(new Font("", Font.BOLD, 20));
/*画字,将随机数字转换成十六进制Integer.toHexString(index),16)再转换字符(char)(Integer.parseInt,
在设置每个文字的位置
*/
g.drawString((char)(Integer.parseInt(Integer.toHexString(index),16))+"", i*22+4, 18);
//将其存放在StringBuffer中,以便后面读取作比较
sBuffer.append((char)(Integer.parseInt(Integer.toHexString(index),16)));
}
//将得到的文字设置到session中
request.getSession().setAttribute("piccode", sBuffer.toString());
/*将这个验证码图片读写到页面中
* write(RenderedImage im, String formatName, OutputStream output)
*/
ImageIO.write(bImage, "jpg", response.getOutputStream());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
在做一个js刷新验证码的,用于看不清,或者别的刷新用处
function Checktest(){
var time=new Date().getTime();
$("#pic").attr('src',"CheckTestServlet?d="+time)
}
再写一个Ajax去验证用户输入的是否正确返回提示,这是用jQuery做的,需要引js
function testCheck(num){
$.ajax({
type:"post",//提交方式
url:"TestCheckServlet",//提交地址
async:true,//是否异步请求
dataType:"html",//返回类型
data:{"num":num},//传过去的值
success:function(data,textStatus){//成功执行的方法
$("#checks").html(data)
},
error:function(){//失败执行的方法
alert("error");
}
})
}
有点麻烦的再去做一个Servlet去验证Ajax传过来的值是否匹配验证码
@WebServlet("/TestCheckServlet")
public class TestCheckServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
PrintWriter out=response.getWriter();
//得到输入的验证码与随机的图片验证码作比较,判断是否相等,返回提示用户,
if (request.getSession().getAttribute("piccode").toString().equals(request.getParameter("num"))) {
out.println("验证码正确");
}else {
out.println("验证码错误");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
就这样验证码已经基本搞定,其中还有许多需要修改的内容,花样,根据需求而来
以上就是二维码的制作,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# JSP
# 验证码
# 验证码的制作步骤
# 验证码的实例
# jsp页面验证码完整实例
# JSP实用教程之简易图片验证码的实现方法(附源码)
# JSP实现登录功能之添加验证码
# jsp页面验证码demo
# JSP验证码动态生成方法
# jsp+Servlet编程实现验证码的方法
# jsp+ajax实现的局部刷新较验验证码(onblur事件触发较验)
# jsp实现简单验证码的方法
# 做一个
# 随机数
# 可以用
# 加载
# 的是
# 判断是否
# 是一个
# 这是
# 运行环境
# 是一种
# 放在
# 第一个
# 在此
# 如有
# 而来
# 这个问题
# 将其
# 希望能
# 注册用户
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析
详解Android图表 MPAndroidChart折线图
UC浏览器如何设置启动页 UC浏览器启动页设置方法
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
EditPlus中的正则表达式实战(6)
javascript中对象的定义、使用以及对象和原型链操作小结
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧
Laravel如何实现模型的全局作用域?(Global Scope示例)
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
LinuxCD持续部署教程_自动发布与回滚机制
如何在万网自助建站中设置域名及备案?
如何在阿里云服务器自主搭建网站?
如何用好域名打造高点击率的自主建站?
如何快速上传自定义模板至建站之星?
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)
如何快速辨别茅台真假?关键步骤解析
Python函数文档自动校验_规范解析【教程】
Laravel怎么清理缓存_Laravel optimize clear命令详解
iOS验证手机号的正则表达式
html5的keygen标签为什么废弃_替代方案说明【解答】
如何自定义建站之星网站的导航菜单样式?
如何快速搭建高效WAP手机网站?
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
Laravel集合Collection怎么用_Laravel集合常用函数详解
JS弹性运动实现方法分析
微信小程序 wx.uploadFile无法上传解决办法
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
佛山网站制作系统,佛山企业变更地址网上办理步骤?
JavaScript如何实现音频处理_Web Audio API如何工作?
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程
如何在IIS中新建站点并配置端口与IP地址?
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
Laravel如何记录自定义日志?(Log频道配置)
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
php打包exe后无法访问网络共享_共享权限设置方法【教程】
如何快速搭建安全的FTP站点?
Laravel如何实现用户密码重置功能?(完整流程代码)
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
Laravel PHP版本要求一览_Laravel各版本环境要求对照
使用C语言编写圣诞表白程序
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
Python进程池调度策略_任务分发说明【指导】

