技术:Java-Web基础|生成图片验证码(二)

简介: 验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类


1 验证码


1.1 什么是验证码?

我搜索百度,从百度百科中拿出来一段话:

验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。


1.2 验证码的历史

验证码这个词最早是在2002年出现在卡内基梅隆大学。


1.3 验证码的作用

防止恶意破解密码、刷票、论坛灌水、刷页


1.4 验证码的分类

验证码整体来说分为五类,他们分别是

  • 静态图片内容验证码:一般都是输入一些随机码,形式上还可以有计算
  • Gif动画验证码:动态展示一些随机码,形式上还可以有计算
  • 手机短信验证码:发送短信随机验证码
  • 手机语音验证码:语音验证码,也可以让你读出一些随机码或计算结果
  • 视频验证码:点击视频中的一些随机码,计算结果

了解了验证码之后,我们开始手工实现一些验证码,当然你也可以使用一些已经封装好的工具来实现这个功能,例如Hutool、Google、Baidu、阿里等大佬们封装好的一些工具类直接实现验证码。


2 实现一个验证码

如果我们想要实现一个验证码,那么就得先要了解下验证码的实现原理以及代码实现。


2.1 验证码的原理

网页之间实现验证码大体上有如下步骤:

1)生成一个随机数

2)将随机数写入图片

3)将图片返回到网页

4)用户获取到图片信息,输入图片内容

5)用户提交内容,服务端验证内容的准确性


整体的流程,使用一张图可能会更形象些,大家可以在这图里面体会下。

image.png

这里简单使用“静态图片内容验证码”来作为一个实验例子,来实现我们需要的验证码功能。


2.1 生成一个算法验证码


这里同技术:Java-Web基础|生成图片验证码(一)的逻辑是一样的,这里我就简单的只写这个算法逻辑吧。


生成一个随机码的步骤大体如下:

1)创建一个类RandImagesVerifCode

2)编写一个名叫randomString(String baseString, int length)的方法

3)测试实验


完整的代码如下:

packagecom.liuyc.tooljdk.image;
importjava.util.concurrent.ThreadLocalRandom;
/*** <p> Picture Verification Code </p>** @author Aion.Liu* @version v1.0.0* @description TODO* @since 2022/9/1 22:24*/publicclassRandImagesVerifCode {
publicstaticvoidmain(String[] args) {
Map<String, Object>resultMap=RandImagesVerifCode.randomCalculateString();
System.out.println("需要写入Redis的数据:"+resultMap.get("result"));
// System.out.println("需要展示到页面的数据:" + resultMap.get("checkCode"));// 参考上一个章节的内容Stringbase642=RandImagesVerifCode.produceImage(resultMap.get("checkCode").toString());
System.out.println("需要回显到页面的数据:"+base642);
    }
/*** 获取100以内计算格式的验证码** @return*/publicstaticMap<String, Object>randomCalculateString() {
Randomrandom=newRandom();
intintTemp;
intintFirst=random.nextInt(100);
intintSec=random.nextInt(100);
StringcheckCode="";
intresult=0;
switch (random.nextInt(6)) {
case0:
if (intFirst<intSec) {
intTemp=intFirst;
intFirst=intSec;
intSec=intTemp;
                }
checkCode=intFirst+"-"+intSec+"=?";
result=intFirst-intSec;
break;
case1:
if (intFirst<intSec) {
intTemp=intFirst;
intFirst=intSec;
intSec=intTemp;
                }
checkCode=intFirst+"-? ="+ (intFirst-intSec);
result=intSec;
break;
case2:
if (intFirst<intSec) {
intTemp=intFirst;
intFirst=intSec;
intSec=intTemp;
                }
checkCode="?-"+intSec+"="+ (intFirst-intSec);
result=intFirst;
break;
case3:
checkCode=intFirst+"+"+intSec+"=?";
result=intFirst+intSec;
break;
case4:
checkCode=intFirst+"+?="+ (intFirst+intSec);
result=intSec;
break;
case5:
checkCode="?+"+intSec+"="+ (intFirst+intSec);
result=intFirst;
break;
        }
Map<String, Object>resultMap=newHashMap<>();
resultMap.put("checkCode", checkCode);
resultMap.put("result", result);
returnresultMap;
    }
}

分步骤解析:

1、public static Map<String, Object> randomCalculateString()

这里是随机生成100以内的加减法,至于获取的结果是算术方式还是结果,我们随机,当然,你也可以按照自己的方式来优化修改这个方法,让它来拥有你想要的计算方式。参数的用途已经写在了代码中。


2、public static String produceImage(String resultCode) throws IOException

这个步骤比较简单

1)生成一张图片,将验证码写入图片,这里其实是将上述的表达式写入图片,而计算的结果写入redis,用于后期校验

2)将图片写入到流中并返回



执行后的结果如下:

需要写入Redis的数据:94

需要回显到页面的数据:data:image/jpg;base64,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


我们可以使用任意编写一个Html,然后将返回的数据写入img标签的src中,

<!DOCTYPE html><htmllang="en"><head><metacharset="UTF-8"><title>Title</title></head><body><imgsrc="data:image/jpg;base64,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"/></body></html>


打开网页后调试下结果如下结果。

image.png

现在,我们便完成了网页验证码的开发以及回显示到网页中啦。

相关文章
|
3天前
|
前端开发 JavaScript 搜索推荐
HTML与CSS在Web组件化中的核心作用及前端技术趋势
本文探讨了HTML与CSS在Web组件化中的核心作用及前端技术趋势。从结构定义、语义化到样式封装与布局控制,两者不仅提升了代码复用率和可维护性,还通过响应式设计、动态样式等技术增强了用户体验。面对兼容性、代码复杂度等挑战,文章提出了相应的解决策略,强调了持续创新的重要性,旨在构建高效、灵活的Web应用。
16 6
|
21天前
|
JSON 前端开发 JavaScript
java-ajax技术详解!!!
本文介绍了Ajax技术及其工作原理,包括其核心XMLHttpRequest对象的属性和方法。Ajax通过异步通信技术,实现在不重新加载整个页面的情况下更新部分网页内容。文章还详细描述了使用原生JavaScript实现Ajax的基本步骤,以及利用jQuery简化Ajax操作的方法。最后,介绍了JSON作为轻量级数据交换格式在Ajax应用中的使用,包括Java中JSON与对象的相互转换。
34 1
|
28天前
|
SQL 监控 Java
技术前沿:Java连接池技术的最新发展与应用
本文探讨了Java连接池技术的最新发展与应用,包括高性能与低延迟、智能化管理和监控、扩展性与兼容性等方面。同时,结合最佳实践,介绍了如何选择合适的连接池库、合理配置参数、使用监控工具及优化数据库操作,为开发者提供了一份详尽的技术指南。
31 7
|
23天前
|
SQL 负载均衡 安全
安全至上:Web应用防火墙技术深度剖析与实战
【10月更文挑战第29天】在数字化时代,Web应用防火墙(WAF)成为保护Web应用免受攻击的关键技术。本文深入解析WAF的工作原理和核心组件,如Envoy和Coraza,并提供实战指南,涵盖动态加载规则、集成威胁情报、高可用性配置等内容,帮助开发者和安全专家构建更安全的Web环境。
41 1
|
1月前
|
移动开发 前端开发 Java
过时的Java技术盘点:避免在这些领域浪费时间
【10月更文挑战第14天】 在快速发展的Java生态系统中,新技术层出不穷,而一些旧技术则逐渐被淘汰。对于Java开发者来说,了解哪些技术已经过时是至关重要的,这可以帮助他们避免在这些领域浪费时间,并将精力集中在更有前景的技术上。本文将盘点一些已经或即将被淘汰的Java技术,为开发者提供指导。
68 7
|
26天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
41 3
|
26天前
|
SQL 监控 Java
Java连接池技术的最新发展,包括高性能与低延迟、智能化管理与监控、扩展性与兼容性等方面
本文探讨了Java连接池技术的最新发展,包括高性能与低延迟、智能化管理与监控、扩展性与兼容性等方面。同时,结合最佳实践,介绍了如何选择合适的连接池库、合理配置参数、使用监控工具及优化数据库操作,以实现高效稳定的数据库访问。示例代码展示了如何使用HikariCP连接池。
14 2
|
28天前
|
Java 数据库连接 数据库
优化之路:Java连接池技术助力数据库性能飞跃
在Java应用开发中,数据库操作常成为性能瓶颈。频繁的数据库连接建立和断开增加了系统开销,导致性能下降。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接,显著减少连接开销,提升系统性能。文章详细介绍了连接池的优势、选择标准、使用方法及优化策略,帮助开发者实现数据库性能的飞跃。
28 4
|
26天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
25 1
|
26天前
|
算法 Java 数据库连接
Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性
本文详细介绍了Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性。连接池通过复用数据库连接,显著提升了应用的性能和稳定性。文章还展示了使用HikariCP连接池的示例代码,帮助读者更好地理解和应用这一技术。
37 1
下一篇
无影云桌面